Arduino и ЧПУ на Portal-PK.ru http://portal-pk.ru/ Arduino проекты, уроки, а также самоделки и самодельные ЧПУ станки на Portal-PK.ru ru #30. Радиопульт с приемником HY-DJM-5V. Подключаем к Arduino. http://portal-pk.ru/news/276-radiopult-s-priemnikom-hy-djm-5v-podklyuchaem-k-arduino.html Константин Portal-PK 2020-12-12T14:21:47+03:00 При изучении Arduino, часто возникают разнообразные идеи. Одна из самых распространённых - это беспроводное управление несколькими реле. Для включения различной нагрузки: открывать гаражные ворота, включать и выключать электроприборы и управление освещением. Но как быть, если знания не хватает для реализации идеи. Для этого отлично подойдёт радиопульт, в виде брела, который продается вместе с приемником HY-DJM-5V. Почему данный пульт подойдёт для новичка? Это связано с простотой подключения и использования радиопульта с приёмником HY-DJM-5V в Arduino проектах. Данный пульт и приемник я использовал в управлении светом в проекте «Arduino управление светом с 3 мест: Пульт ДУ + Радиопульт + Переключатель».

Описание радиопульта и приемникаHY-DJM-5V.

Описание радиопульта и приемникаHY-DJM-5V.

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

Характеристики пульта

Характеристики пульта:

  • частота передачи 315 Мгц,
  • количество каналов 4,
  • дальность действия до 50 м
  • элемент питания 23 a / 12 v

Не смотря на то, что обещают до 50 метров дальность действия, мой пульт позволяет управлять только до 20 м. при прямой видимости, за стеной уже не работает. Рассчитал по формуле, и припаял к приемнику спиралевидную антенну, сигнал стал более устойчивым, но радиус действия практически не изменился. Возможно, что я неправильно рассчитал антенну, но формула простая, и ошибиться я не мог.

Разобрал я пульт, чтобы посмотреть, из чего он состоит. Пульт сделан на микросхеме SC 2262.

Пульт сделан на микросхеме SC 2262.

Схема пульта дистанционного управления на микросхеме SC 2262.

Схема пульта дистанционного управления на микросхеме SC 2262.

Характеристики приемника HY-DJM-5V:

  • частота приема - 315 Мгц,
  • количество каналов – 4,
  • режим – "включен", пока нажата кнопка,
  • тип выхода - открытый коллекто

Схема приемника HY-DJM-5V.

Схема приемника HY-DJM-5V.

Так приемник HY-DJM-5V выглядит в живую.

Так приемник HY-DJM-5V

Кодирование сигнала.

Для того, чтобы ваш сосед с таким же радиопультом не смог открыть ваш гараж, или включать и выключать свет, на пульте и на приемнике есть система кодирования. Рядом со свободными ножками приемника и передатчика есть 2 контактные полоски, одна «+» вторая «-».

Рядом со свободными ножками приемника и передатчика есть 2 контактные полоски

И для кодирования сигнала свободные ножки припаиваем к минусу или плюсу, так, чтобы на приемнике и передатчике эти перемычки были одинаковые.

Использование радиопульта и приёмника HY-DJM-5V без Arduino.

Использование радиопульта и приёмника HY-DJM-5V без Arduino.

На фото приведен пример использования приемника HY-DJM-5V без Arduino. Мы можем подключить приемник к источнику питания 5В, и управлять нагрузкой. На схеме ниже подключены четыре светодиода. А как мы знаем, вместо светодиодов можно, без проблем, подключить пятивольтовое реле.

Схема подключения приемника HY-DJM-5V без Arduino будет вот такой.

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

Использование приемника без Arduino имеет большой минус. Светодиод светится, пока нажата кнопка на радиопульте. Поэтому, в данную схему добавит Arduino NANO.

Управление реле, с помощью радиопульта с приемником HY-DJM-5V и Arduino NANO.

Как мы поняли из примера выше, нам нужно в схему добавить Arduino. Схема подключения HY-DJM-5V к Arduino NANO будет следующая:

Схема подключения HY-DJM-5V к Arduino NANO


Код для управления 4 реле, с помощью приемника HY-DJM-5V и Arduino NANO.

Код для управления 4 реле, с помощью приемника HY-DJM-5V и Arduino NANO.

Как и писал в начале статьи, код получается достаточно простой. Даже проще, чем управление светодиодом с помощью кнопки. Тут не нужно бороться с дребезгом. Но задержку нужно сделать, потому что, при большом расстоянии между пультом и приемником, сигнал бывает не стабильным, и реле будет несколько раз подряд включаться и выключаться.
// Радиопульт с приемником HY-DJM-5V.
// https://portal-pk.ru
//переменные для подключении 4 реле //
#define RELAY1 6
#define RELAY2 7
#define RELAY3 8
#define RELAY4 9
// переменные для подключения 4 контактов с приемника HY-DJM-5V //
#define RADIO_PIN1 2
#define RADIO_PIN2 3
#define RADIO_PIN3 4
#define RADIO_PIN4 5
// переменные для хранения состояния реле //
boolean statusRelay1 = false;
boolean statusRelay2 = false;
boolean statusRelay3 = false;
boolean statusRelay4 = false;
void setup() {
  //инициализировать пины реле как выход //
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  // пины приемника на вход //
  pinMode(RADIO_PIN1, INPUT);
  pinMode(RADIO_PIN2, INPUT);
  pinMode(RADIO_PIN3, INPUT);
  pinMode(RADIO_PIN4, INPUT);
// инициализируем работу с монитором порта 
// и выведем надпись "Relay Ok!" 
  Serial.begin(9600);
  Serial.println("Relay Ok!");
}
void loop() {
  //Если пришел сигнал 
  //выводим в монитор порта информацию что сработало реле 1 "Relay 1". 
  if ( digitalRead(RADIO_PIN1) == HIGH) {
    Serial.println("Relay 1");
    //инвертируем статус реле //
    statusRelay1 = !statusRelay1;
    // отправляем статус на включения или выключения //
    digitalWrite(RELAY1, statusRelay1);
    // подождем 100 мс //
    delay(100);
  }
  if ( digitalRead(RADIO_PIN2) == HIGH) {
    Serial.println("Relay 2");
    statusRelay2 = !statusRelay2;
    digitalWrite(RELAY2, statusRelay2);
    delay(100);
  }
    if ( digitalRead(RADIO_PIN3) == HIGH) {
    Serial.println("Relay 3");
    statusRelay3 = !statusRelay3;
    digitalWrite(RELAY3, statusRelay3);
    delay(100);
  }
    if ( digitalRead(RADIO_PIN4) == HIGH) {
    Serial.println("Relay 4");
    statusRelay4 = !statusRelay4;
    digitalWrite(RELAY4, statusRelay4);
    delay(100);
  }
}

Описание кода.

Создаем переменные для подключения 4 реле, и переменные для подключения 4 контактов с приемника HY-DJM-5V.

//переменные для подключении 4 реле //
#define RELAY1 6
#define RELAY2 7
#define RELAY3 8
#define RELAY4 9
// переменные для подключения 4 контактов с приемника HY-DJM-5V //
#define RADIO_PIN1 2
#define RADIO_PIN2 3
#define RADIO_PIN3 4
#define RADIO_PIN4 5

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

// переменные для хранения состояния реле //
boolean statusRelay1 = false;
boolean statusRelay2 = false;
boolean statusRelay3 = false;
boolean statusRelay4 = false;

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

//инициализировать пины реле как выход //
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  // пины приемника на вход //
  pinMode(RADIO_PIN1, INPUT);
  pinMode(RADIO_PIN2, INPUT);
  pinMode(RADIO_PIN3, INPUT);
  pinMode(RADIO_PIN4, INPUT);

Также инициализируем работу с монитором порта, и выведем надпись "Relay Ok!", что означает, что у нас все работает, и можно начать управлять нашими реле.

// инициализируем работу с монитором порта 
// и выведем надпись "Relay Ok!" 
  Serial.begin(9600);
  Serial.println("Relay Ok!");

В основном цикле loop() будем проверять, по какому каналу пришел сигнал, для этого создадим 4 одинаковых условия для каждого канала.

//Если пришел сигнал 
  //выводим в монитор порта информацию что сработало реле 1 "Relay 1". 
  if ( digitalRead(RADIO_PIN1) == HIGH) {
    Serial.println("Relay 1");
    //инвертируем статус реле //
    statusRelay1 = !statusRelay1;
    // отправляем статус на включения или выключения //
    digitalWrite(RELAY1, statusRelay1);
    // подождем 100 мс //
    delay(100);
  }
  if ( digitalRead(RADIO_PIN2) == HIGH) {
    Serial.println("Relay 2");
    statusRelay2 = !statusRelay2;
    digitalWrite(RELAY2, statusRelay2);
    delay(100);
  }
    if ( digitalRead(RADIO_PIN3) == HIGH) {
    Serial.println("Relay 3");
    statusRelay3 = !statusRelay3;
    digitalWrite(RELAY3, statusRelay3);
    delay(100);
  }
    if ( digitalRead(RADIO_PIN4) == HIGH) {
    Serial.println("Relay 4");
    statusRelay4 = !statusRelay4;
    digitalWrite(RELAY4, statusRelay4);
    delay(100);
  }

Разберём работу по первому каналу. Если пришел сигнал, то выводим в монитор порта информацию, что сработало реле 1 "Relay 1".

if ( digitalRead(RADIO_PIN3) == HIGH) {
    Serial.println("Relay 3");
...
}

Затем инвертируем статус реле, и отправляем статус на включение или выключение.

statusRelay3 = !statusRelay3;
digitalWrite(RELAY3, statusRelay3);
delay(100);

И подождем 100 мс, для того, чтобы наше реле не сработало 2 раза, как и писал выше.

Подключение модуля с 4 твердотельными реле к модулю HY-DJM-5V.

Подключение модуля с 4 твердотельными реле к модулю HY-DJM-5V.

Не стал я убирать светодиоды с макетной платы и, параллельно с ними, подключил модуль с 4 твердотельными реле. Вот что получилось. Как видим, все работает отлично.

Схема подключения четырех реле к модулю HY-DJM-5V.

Схема подключения четырех реле к модулю HY-DJM-5V.

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

Как видим, все отлично работает, и, используя пульт радиоуправления с приемником HY-DJM-5V, можно сделать и другие интересные проекты.

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#29. Подключаем драйвер мотора MX1508 к Arduino. http://portal-pk.ru/news/275-29-podklyuchaem-draiver-motora-mx1508-k-arduino.html Константин Portal-PK 2020-11-27T09:45:13+03:00 Модуль двигателя MX1508, рассмотренный в этой статье, рекламируется на Aliexpress как «Двухканальная плата драйвера двигателя постоянного тока L298N, PWM Speed Dual H Bridge Stepper Module», однако присутствует микросхема MX1508 китайского производства. Также отличаются характеристики драйвера MX1508 от L298N. Давайте рассмотрим подробней данный драйвер и разберемся, как его подключить к Arduino и управлять моторами постоянного тока.

При управлении, например, с платой Arduino UNO, можно управлять двумя двигателями, при этом вращать в любом направлении каждый двигатель. Драйвер представляет из себя Н-мост с рабочим током 800 мА и пиковым током 2,5 А, а также, со встроенной системой контроля температуры.

Модуль двигателя MX1508

Характеристики драйвера MX1508:

  • Напряжение питания модуля 2 - 9,6 В.
  • Диаметр монтажного отверстия: 2 мм.
  • Входное напряжение сигнала: 1,8- 7 В.
  • Ток для одного канала: 0,8 А.
  • Пиковый ток: до 2,5 А.
  • Ток в режиме ожидания: менее 0,1 мкА.
  • Схема защиты от перегрева: встроенная (TSD) с эффектом гистерезиса.
  • Размер: 24,7 х 21 х 7 мм.

Общие сведения о драйвере MX1508.

Основной чип модуля - это микросхема MX1508, состоящая из двух H-мостов (H-Bridge), один для выхода A, второй для выхода B, каждый канал рассчитан на 0,8 А с пиком 2,5 А. H-мост широко используется в электронике и служит для изменения вращения двигателя, схема H-моста содержит четыре транзистора (ключа) с двигателем в центре, образуя H-подобную компоновку. Принцип работы прост, при одновременном закрытии двух отдельных транзисторов, изменяется полярность напряжения, приложенного к двигателю. Это позволяет изменять направление вращения двигателя. На рисунке ниже, показана работа H-мостовой схемы.

работа H-мостовой схемы

Управлять двигателем можно низковольтным напряжением, ниже, чем напряжение на плате Arduino. Для управления скоростью используется широтно-импульсная модуляция (PWM).

Модуль MX1508 содержит разъем для подключения питания, два выхода A и B,

Модуль MX1508 содержит разъем для подключения питания, два выхода A и B, и разъем управления, с назначением каждого можно ознакомиться ниже:

  • Вывод «+» и «-» — питание модуля и двигателей, от 2 до 9,6 В;
  • Выводы A1 и A2 — используются для управления направлением вращения двигателя A;
  • Выводы B1 и B2 — используются для управления направлением вращения двигателя B;
  • Выходы MOTOR A — разъем для двигателя A;
  • Выходы MOTOR B — разъем для двигателя B;

Подключение MX1508 к Arduino (коллекторный двигатель).

Необходимые детали:

  • Arduino UNO.
  • Драйвер мотора на MX1508.
  • Коллекторный двигатель.

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

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

Первым делом, необходимо подключить источник питания от 2 до 9,6 B к модулю (в примере используется 5 В. от Arduino). Далее, подключаем управляющие провода A1, A2, B1, B2 (встречается маркировка, как на L298: IN1, IN2, IN3, IN1) к цифровым выводам Arduino 10, 11, 5 и 6. Теперь, подключаем двигатели, один к клеммам MOTOR A , а другой к клеммам MOTOR B. Схема подключения приведена ниже.

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

Теперь подключаем Arduino к компьютеру и загружаем скетч ниже.

const int PinA1 = 5;  // (ШИМ) вывод 5 соединен с выводом А1
const int PinA2 = 6;  // (ШИМ) вывод 6 соединен с выводом А2
const int PinB1 = 10; // (ШИМ) вывод 10 соединен с выводом (pin) B1
const int PinB2 = 11;  //(ШИМ) вывод 11 соединен с выводом (pin)B2
byte speed = 250;  // измените это значение (0-255), 
                  //чтобы управлять скоростью вращения двигателей
void setup() {
  pinMode(PinA1, OUTPUT); // установите контакты на выход
  pinMode(PinA2, OUTPUT);
  pinMode(PinB1, OUTPUT);
  pinMode(PinB2, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  Serial.println("Avanti");
  forward();
  delay(2000);
  STOP();
  Serial.println("Indietro");
  backward();
  delay(2000);
  STOP();
  Serial.println("Sinistra");
  left();
  delay(2000);
  STOP();
  Serial.println("Destra");
  right();
  delay(2000);
  STOP();
}
void backward() // Вперед.
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, speed);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, speed);
}
void forward() //Назад...
{
  analogWrite(PinA1, speed);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, speed);
  analogWrite(PinB2, 0);
}
void left() // В левую сторону
{
  analogWrite(PinA1, speed);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, speed);
}
void right() //В правую сторону
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, speed);
  analogWrite(PinB1, speed);
  analogWrite(PinB2, 0);
}
void STOP() //Стоп
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, 0);
  delay (2000);
}

Описание скетча:

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

const int PinA1 = 5;  // (ШИМ) вывод 5 соединен с выводом А1
const int PinA2 = 6;  // (ШИМ) вывод 6 соединен с выводом А2
const int PinB1 = 10; // (ШИМ) вывод 10 соединен с выводом (pin) B1
const int PinB2 = 11;  //(ШИМ) вывод 11 соединен с выводом (pin)B2

Управление скоростью осуществляется с помощью ШИМ, для удобства используем переменную speed, в которой указываем скорость двигателя. Значение «0» - значит остановка, а «255» равносильно напряжению питания, и двигатели крутятся на максимальной скорости.

byte speed = 250;  // измените это значение (0-255), 
                  //чтобы управлять скоростью вращения двигателей

Далее, мы указываем, что данные выводы используем как выход.

  pinMode(PinA1, OUTPUT); // установите контакты на выход
  pinMode(PinA2, OUTPUT);
  pinMode(PinB1, OUTPUT);
  pinMode(PinB2, OUTPUT);

Направление вращения двигателя осуществляется с помощью выводов A1 и A2 - для первого двигателя, B1 и B2 - для второго двигателя, то есть, если подать на вывод A1 — 0B (LOW), а на A2 — 5B (HIGH), двигатель A будет вращаться вперед (так же и для двигателя B). Для вращения назад, необходимо подать на A1 — 5B (HIGH), а на A2 — 0B (LOW), двигатель A будет вращаться назад (так же и для двигателя B). На основании этого напишем небольшие функции, которые позволят вращать оба двигателя вперед, назад, в противоположном направлении, и останавливать вращение обоих двигателей.

void backward() // Вперед.
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, speed);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, speed);
}
void forward() //Назад...
{
  analogWrite(PinA1, speed);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, speed);
  analogWrite(PinB2, 0);
}
void left() // В левую сторону
{
  analogWrite(PinA1, speed);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, speed);
}
void right() //В правую сторону
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, speed);
  analogWrite(PinB1, speed);
  analogWrite(PinB2, 0);
}
void STOP() //Стоп
{
  analogWrite(PinA1, 0);
  analogWrite(PinA2, 0);
  analogWrite(PinB1, 0);
  analogWrite(PinB2, 0);
  delay (2000);
}

Реализуем вывод в монитор порта информацию о направлении вращения двигателя в данный момент.

  Serial.println("Avanti");
  forward();
  delay(2000);

Реализуем вывод в монитор порта информацию о направлении вращения двигателя в данный момент.

Это поможет определить, правильно ли мы всё подключили, или нет. Если двигатели будут вращаться не в том направлении, как выводится в мониторе порта, то необходимо поменять местами провода подключения двигателей, и повторить проверку. Эта информация позволит настроить минимальный код для создания радиоуправляемой машины. Вот такие машинки я делал на Arduino и ESP8266 с использованием драйвера L298:

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

Вот такие машинки я делал на Arduino и ESP8266 с использованием драйвера L298

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#28. Подключение модуля освещенности к Arduino. http://portal-pk.ru/news/274-28-podklyuchenie-modulya-osveshchennosti-k-arduino.html Константин Portal-PK 2020-11-21T12:39:28+03:00 В данном Arduino уроке подключим модуль освещённости к Arduino, и научимся настраивать датчик для работы при различной освещённости. В основе датчика лежит светочувствительный полупроводниковый прибор – фоторезистор. Что такое фоторезистор, и как его можно подключить к Arduino, рассматривали в предыдущем уроке: «Подключение фоторезистора к Arduino». В чем преимущество модуля освещённости, и как его использовать в Arduino проектах, рассмотрим в данном уроке.

Два вида моделей освещённости.

При покупке модуля освещённости, нужно определиться с вашей задачей. Что вы планируете собрать, и как должен работать модуль освещённости. Это связано с тем, что модули освещённости бывают разные. На фото ниже приведены 2 модуля освещённости.

Два вида моделей освещённости.

Аналоговый модуль освещённости KY-018.

Arduino модуль освещённости KY-018 черного цвета. Этот модуль состоит из фоторезистора и линейного резистора 10 кОм. Сопротивление фоторезистора будет уменьшаться при наличии света, и увеличиваться при его отсутствии. Выход аналоговый, и он определяет интенсивность света.

Аналоговый модуль освещённости KY-018.

Схема подключения модуля освещённости KY-018 к Arduino.

Схема подключения модуля освещённости KY-018 к Arduino.

На модуль подается питание 5 Вольт, а в зависимости от освещенности в помещении, на выходе модуля (S) меняется напряжение от 0 до 5 Вольт. При подаче этого сигнала на аналоговый вход микроконтроллера, Arduino преобразует сигнал, при помощи АЦП, в диапазоне значений от 0 до 1023.

Скетч для модуля освещённости KY-018.

Скетч для модуля освещённости KY-018.

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

byte sensorPin = A0;
byte ledPin = 3;
// Присваиваем имя для цифрового значения аналогового входа A0
// int округляет значения 
int value = 0;
void setup() {
  // Пин 3 со светодиодом будет выходом (англ. «output»)
  pinMode(ledPin, OUTPUT);
  // Пин A0 с фоторезистором будет входом (англ. «input»)
  pinMode(sensorPin, INPUT);
}
void loop() {
  // Считываем значение с фоторезистора на аналоговом входе A0
  value = analogRead(sensorPin);
  // value значение в диапозоне от 0 до 1023
  // Полученные значения на аналоговом входе A0 делим на 4 
  //чтобы уложиться в диопозон от 0 до 255
  data = value / 4;
  // Включаем светодиод с полученной ранее мощностью - от 0 до 255
  analogWrite(ledPin, data);
}

Цифровой датчик освещённости на LM393.

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

Цифровой датчик освещённости на LM393.

Модуль освещенности на LM393.

Модуль освещенности на LM393 используется для измерения интенсивности света в различных устройствах, таких как: автоматизация света (включение света ночью), в роботах (определение дня или ночи) и приборах, контролирующих уровень освещенности. Измерение осуществляется с помощью светочувствительного элемента (фоторезистора), который меняет сопротивление в зависимости от освещенности.

Технические параметры

  • Напряжение питания: 3.3 В. - 5.5 В.
  • Потребляемый ток: 10 мА.
  • Цифровой выход: TTL (лог 1 или лог 0)
  • Аналоговый выход: 0 В. … Vcc
  • Диаметр монтажного отверстия: 2.5 мм.
  • Выходной ток: 15 мА.
  • Габариты: 42мм. х 15мм. х 8мм.

Общие сведения датчик освещённости на LM393.

Существуют два модуля на базе LM393, их визуальное отличие только в количестве выводов (3 pin и 4 pin), дополнительный вывод добавлен для снятия прямых показаний с фоторезистора (аналоговый выход), по аналогии работы модуля KY-018. Рассмотрим четырех контактный вариант модуля. У этих двух модулей измерение осуществляется с помощью фоторезистора, который изменяет напряжение в цепи, в зависимости от количества света, попадающего на него. Чтобы представить, как свет будет влиять на фоторезистор, приведу краткую таблицу.

Общие сведения датчик освещённости на LM393.

Модуль освещенности с четырьмя выводами содержит два выходных контакта, аналоговый и цифровой, и два контакта для подключения питания. Для считывания аналогово сигнала предусмотрен отдельный вывод «AO», с которого можно считать показания напряжения с 0 В … 3.3 В или 5 В, в зависимости от используемого источника питания. Цифровой вывод DO, устанавливается в лог «0» или лог «1», в зависимости от яркости, чувствительность выхода можно регулировать с помощью поворотного потенциометра. Выходной ток цифрового выхода способен выдать более 15 мА, что очень упрощает использование модуля, и дает возможность использовать его, минуя контроллер Arduino, и подключая его напрямую к входу одноканального реле, или одному из входов двухканального реле. Принципиальная схема модуля освещенности на LM393 с 3 pin и 4 pin, показана ниже.

Принципиальная схема модуля освещенности на LM393 с 4 pin.

Принципиальная схема модуля освещенности на LM393 с 4 pin

Принципиальная схема модуля освещенности на LM393 с 3 pin.

Принципиальная схема модуля освещенности на LM393 с 3 pin

Теперь, как же работает схема. Фоторезистор показан Foto (IN). Основная микросхема модуля - это компаратор LM393 (U1), который производит сравнение уровней напряжения на входах INA- и INA+. Чувствительность порога срабатывания задается с помощью потенциометра R2, и, в результате сравнений, на выходе D0, микросхемы U1, формируется лог «0», или лог «2», который поступает на контакт D0 разъема J1.

Цифровой датчик освещённости на LM393.

Назначение J1 (в исполнении 4 pin)

  • VCC - «+» питание модуля
  • GND - «-» питание модуля
  • D0 - цифровой выход
  • A0 -аналоговый выход

Назначение J1 (в исполнении 3 pin)

  • VCC - «+» питание модуля
  • GND - «-» питание модуля
  • D0 - цифровой выход

Подключение модуля освещенности к Arduino UNO.

Подключение модуля освещенности к Arduino UNO.

Подключение модуля освещенности к Arduino NANO

Подключение модуля освещенности к Arduino UNO

Необходимые детали:

  • Arduino UNO или Arduino NANO
  • Модуль освещенности, LM393
  • Провод DuPont, 2,54 мм.
  • Кабель USB 2.0

Подключение:

В данном примере буду использовать модуль освещенности LM393, 3 pin, и Arduino UNO, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего три провода, сначала подключаем D0 к 2 цифровому пину Arduino, осталось подключить питание GND к GND и VCC к 5V (можно запитать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Запускаем среду разработки и загружаем данный скетч, затем открываем мониторинг порта.

int pinD0 = A1;                    // Пин к которому подключен D0
// Присваиваем имя для порта 9 со светодиодом
#define LED 13

void setup() 
{
  // Пин 9 со светодиодом будет выходом (англ. «output»)
  pinMode(LED, OUTPUT);
  pinMode (pinD0, INPUT);          // Установим вывод A1 как вход
  Serial.begin (9600);             // Задаем скорость передачи данных
}

void loop() 
{
  int xD0;                     // Создаем переменные
  xD0 = digitalRead (pinD0);        // считываем значение с порта pinD0

  Serial.print("Sensor: ");         // Выводим текст
    
  if (xD0 == HIGH)                  // Если xD0 равно "1" 
   {            
     Serial.println ("ON");         // Выводим текст
     digitalWrite(LED, HIGH);
   }
  else
   {
    Serial.println ("OFF");         // Если xD0 равно "0" 
    digitalWrite(LED, LOW);
   }
delay (500);                        // Ждем 500 мкс.
}

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

В мониторе порта можно увидеть, когда модуль освещенности срабатывает и отключается

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

Как видим, датчиков освещенности для Arduino проектов существует несколько.

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

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#27. Подключение фоторезистора к Arduino. http://portal-pk.ru/news/273-27-podklyuchenie-fotorezistora-k-arduino.html Константин Portal-PK 2020-11-16T16:23:21+03:00 Сегодня в уроке рассмотрим, что такое фоторезистор, и подключим его в Arduino UNO и Arduino NANO. Рассмотрим пару примеров как с помощью данного элемента электрической цепи можно управлять яркостью светодиода и светильника.

Что такое Фоторезистор?

У полупроводниковых материалов есть много интересных свойств. Одно из них – изменение сопротивления под действием света.Электрическое сопротивление полупроводниковых элементов используется в приборах под названием «фоторезистор».

Что такое Фоторезистор?

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

Фоторезистор — это полупроводниковый прибор (датчик), который при облучении светом изменяет (уменьшает) свое внутреннее сопротивление.

Устройство фоторезистора.

В основе каждого фоторезистора лежит подложка, чаще всего керамическая, покрытая слоем полупроводникового материала. Поверх этого полупроводника наносится змейкой тонкий слой золота, платины или другого коррозиестойкого металла. Слои наносятся методом напыления.

Устройство фоторезистора.

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

Подключение фоторезистора к Arduino.

В этом уроке соберем электрическую схему «умного» светильника. Если в одном из предыдущих уроков, с помощью ШИМ сигнала, изменяли яркость светодиода, то сегодня мы будем использовать фоторезистор в схеме для автоматического включения светодиода. Фоторезистор будет играть роль переменного сопротивления, которое изменяет напряжение на аналоговом входе A0.

Подключение фоторезистора к Arduino.

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

  • Arduino Uno или Arduino Nano
  • макетная плата
  • 1 фоторезистор
  • 1 светодиод
  • 2 резистора 220 Ом
  • провода «папа-папа»

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

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

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

byte sensorPin = A0;
byte ledPin = 3;
// Присваиваем имя для цифрового значения аналогового входа A0
// int округляет значения 
int value = 0;
void setup() {
  // Пин 3 со светодиодом будет выходом (англ. «output»)
  pinMode(ledPin, OUTPUT);
  // Пин A0 с фоторезистором будет входом (англ. «input»)
  pinMode(sensorPin, INPUT);
}
void loop() {
  // Считываем значение с фоторезистора на аналоговом входе A0
  value = analogRead(sensorPin);
  // value значение в диапозоне от 0 до 1023
  // Если значение value на входе A0 меньше 500, включаем светодиод
  if (value<500) digitalWrite(ledPin, HIGH);
  // В противном случае (если value>500), выключаем светодиод 
  if (value>500) digitalWrite(ledPin, LOW);
}

Пояснения к коду:

  • для удобства, создали переменные: подключения фоторезистора и светодиода;
  • оператор int указывает, что значение value может принимать только целое число, а начальное значение value равно нулю;
  • условный оператор if позволяет определить действие при истинном условии. Оператор else позволяет определить действие, когда условие ложно.

Скетч умного светильника на Arduinoи фоторезисторе.

byte sensorPin = A0;
byte ledPin = 3;

// Присваиваем имя для цифрового значения аналогового входа A0
// int округляет значения 
int value = 0;
 
void setup() {
  // Пин 3 со светодиодом будет выходом (англ. «output»)
  pinMode(ledPin, OUTPUT);
  // Пин A0 с фоторезистором будет входом (англ. «input»)
  pinMode(sensorPin, INPUT);
}
 
void loop() {
  // Считываем значение с фоторезистора на аналоговом входе A0
  value = analogRead(sensorPin);
  // value значение в диапозоне от 0 до 1023
  // Полученные значения на аналоговом входе A0 делим на 4 
  //чтобы уложиться в диопозон от 0 до 255
  data = value / 4;
  
  // Включаем светодиод с полученной ранее мощностью - от 0 до 255
  analogWrite(ledPin, data);
}

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

Пояснения к коду:

  • в этом скетче мы добавили переменную data, которая равна value, деленная на 4;
  • пин 9 мы использовали, как аналоговый выход, который плавно изменяет яркость свечения светодиода, в зависимости от значения data.

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

В этом уроке мы рассмотрели, как подключить фоторезистор к Arduino, в предыдущем уроке мы подключили инфракрасный датчик препятствия YL-63 к Arduino.

В этом уроке мы рассмотрели, как подключить фоторезистор к Arduino, в предыдущем уроке мы подключили инфракрасный датчик препятствия YL-63 к Arduino.

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке.


]]>
#26. Подключение инфракрасного датчика препятствия YL-63 к Arduino. http://portal-pk.ru/news/272-26--podklyuchenie-infrakrasnogo-datchika-prepyatstviya-yl-63.html Константин Portal-PK 2020-11-11T16:11:02+03:00 Сегодня в Arduino Уроке рассмотрим принцип работы инфракрасного датчика препятствия, или как еще его называют, датчик обхода препятствия YL-63 (или FC-51). И научимся подключать датчик к Arduino и рассмотрим пример кода.

Инфракрасный датчик препятствия я YL-63 широко применяется в робототехнике, когда нужно определить препятствие, и объехать его. Поэтому его и называют, иногда, датчиком обхода препятствий. Кроме робототехники данный датчик можно использовать в других Arduino проектах, в которых необходимо определить препятствия. Я использовал данный датчик в следующих Arduino проектах:

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

Технические параметры YL-63 (FC-51).

  • Напряжение питания: 3.3 В - 5.5 В.
  • Потребляемый ток: 10 мА.
  • Цифровой выход: TTL (лог 1 или лог 0)
  • Диаметр монтажного отверстия: 2.5 мм.
  • Выходной ток: 15 мА.
  • Габариты: 42мм. х 15мм. х 8мм.

Описание датчика препятствия YL-63 (FC-51).

Модуль содержит инфракрасный передатчик (ИК диод), излучающий свет в прямом направлении (~ 700 нм, этот свет не виден невооруженным глазом, его можно увидеть только камерой), и приемник (фотодиод), который измеряет отраженное ИК излучение.

700 нм, этот свет не виден невооруженным глазом, его можно увидеть только камерой)

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

одуль содержит инфракрасный передатчик (ИК диод), излучающий свет в прямом направлении

Основная микросхема ИК датчика препятствия - это компаратор LM393 (U1), который производит сравнение уровней напряжений на входах INB- и INB+. Чувствительность порога срабатывания задается с помощью потенциометра R2 и, в результате сравнений, на выходе OUTB микросхемой U1 формируется «LOW» или «HIGH». Принципиальная схема ИК модуля препятствия показана на рисунке ниже.

Принципиальная схема ИК модуля препятствия

Оптический датчик YL-63 относится к классу диффузионных. Название группы датчиков возникло из-за, лежащего в основе работы, датчика отражения излучения по множествам направлений – диффузии излучения отражающей поверхностью. Работа устройства заключается определении освещенности фотоприемника. Поскольку YL-63 фиксирует отраженное излучение, то возникает погрешность измерения расстояния, вызванная различной отражающей способностью поверхностей объектов, изготовленных из разнообразных материалов.

Оптический датчик YL-63 относится к классу диффузионных.

Коэффициенты расстояния для отражения от различных материалов.

Коэффициенты расстояния для отражения от различных материалов.

Различное отражение и поглощение излучения разных материалов используются для работы воспринимающего узла тахометра. Предположим, у нас есть двигатель Стирлинга. Требуется узнать количество оборотов в минуту вала двигателя. Нас выручит YL-63. Достаточно приклеить на маховик фрагмент белой бумаги, направить луч датчика на маховик и получим воспринимающий узел тахометра. Для снижения последствий различных помех, обрабатывающим микроконтроллером накапливаются данные, полученные от датчика за короткий промежуток времени, и производится усреднение. Датчик YL-63 может работать в приборах, не имеющих микроконтроллера.

Индикаторы на плате датчика YL-63.

На плате модуля расположены два индикатора. Свечение зеленого сообщает о включении питания.

Индикаторы на плате датчика YL-63.

Красный светодиод светится, если в зоне обнаружения находится объект. Цвет индикатора может быть другим. На фото ниже приведён датчик, у которого оба индикатора зеленого цвета.

Контакты YL-63.

Датчик препятствия YL-63 ( FC-51) имеет вилку разъема из трех контактов:

Индикаторы на плате датчика YL-63.

  • VCC – питание,
  • GND – общий провод,
  • OUT – выход.

Установка расстояния срабатывания.

Установка расстояния срабатывания.

Настройку устройства облегчает работа индикатора обнаружения. Это позволяет настроить YL-63 (FC-51) на срабатывание в реальных условиях. Установка чувствительности датчика выполняется с помощью переменного резистора, установленного на плате. Препятствие устанавливается на требуемом удалении от фотоприборов датчика. Поворотом подвижного контакта переменного резистора, на плате модуля YL-63, выполняется установка расстояния срабатывания, тем самым добиваются включения красного светодиода. Затем проверяют дистанцию срабатывания перемещением отражающего объекта.

Подключение ИК модуля препятствия YL-63 к Arduino.

Необходимые детали:

  • Arduino UNO R3
  • ИК модуль препятствия YL-63
  • Провод DuPont, 2,54 мм, 20 см

Подключение ИК модуля препятствия YL-63 к Arduino.

В данном примере буду использовать ИК модуль препятствия, YL-63 и Arduino UNO, данные будут передаваться в «Мониторинг порта». Схема не сложная, сначала необходимо подключить питание, GND к GND и VCC к 5V (можно записать и от 3,3В.), затем подключаем вывод OUT к 7 пину Arduino. Схема подключения ниже.

Подключение ИК модуля препятствия YL-63 к Arduino.

Запускаем среду разработки и загружаем данный скетч, затем открываем мониторинг порта.

int irsensor= 7;                    // Вывод OUT на модуле подключен к выходу 7 Arduino
int sensorvalue;                    // Переменная для хранения показаний датчика 
 
void setup()                
{
 Serial.begin(9600);                // Задаем скорость передачи данных
 pinMode(irsensor,INPUT);           // Установим вывод D0 как вход                                                                                                                                                                                
}
 
void loop()
{
 sensorvalue=digitalRead(irsensor); // Считываем показания в переменной sensorvalue.
 Serial.print("Sensor ==");         // Выводим текст
 Serial.println(sensorvalue);       // Выводим текст
 if (sensorvalue==1)
 {
  Serial.println(" No obstacle");   // Выводим текст
  digitalWrite(13,LOW);             // Выключаем светодиод
  delay (500);                      // Ждем 500 мкс
 }
  else 
 {
 Serial.println(" Obstacle ");      // Выводим текст
 digitalWrite(13,HIGH);             // Включаем светодиод
 delay (500);                       // Ждем 500 мкс
 }
}

В мониторинге порта можно увидеть показания с модуля препятствия YL-63 . При выводе в монитор порта значения «1», - значит, что препятствия нет. Вывод значения «0» - означает, что препятствие найдено.

Подключение ИК модуля препятствия YL-63 к Arduino. Запускаем среду разработки и загружаем данный скетч, затем открываем мониторинг порта.

Используя такую несложную логику можно настроить работу робота, чтобы он обнаруживал препятствия, и объезжал их. Для реализации данного алгоритма работы понадобится несколько модулей препятствия, например, 3 штуки. Существуют готовые модули с 5 датчиками препятствия. Как подключить данный модуль препятствия будем рассматривать в следующих Arduino уроках и Arduino проектах.

Подключение ИК модуля препятствия YL-63 к Arduino.

В данном уроке рассмотрели Подключение инфракрасного датчика препятствия YL-63 к Arduino. В предыдущем уроке мы рассматривали, Подключение датчика температуры и давления BMP180 к Arduino.

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#25. Подключение датчика температуры и давления BMP180 к Arduino. http://portal-pk.ru/news/271-25-podklyuchenie-datchika-temperatury-i-davleniya-bmp180-k.html Константин Portal-PK 2020-11-08T07:51:02+03:00 Сегодня в Arduino уроке научимся подключать датчик температуры и давления BMP180 к Arduino.

Данный датчик отлично подойдёт для Arduino проекта, в котором необходимо измерять температуру и давление окружающей среды. Благодаря I2C интерфейсу подключения, данный датчик не занимает дополнительных пинов. Напряжение питания от 3.3 до 5 вольт, что позволяет использовать BMP180 как с Arduino, так и с такими микроконтроллерами как ESP32, ESP8266 и STM32. Если вас интересуют уроки по программированию ESP32, ESP8266, то на моем втором сайте «Ардуино технологии» вы найдете уроки по данной теме, и много другой полезной информации.

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

BMP180 достаточно точный датчик, погрешность измерения давления: 0,1 гектопаскаль, и погрешность измерения температуры: 0,1°С.

Параметры датчика давления и температуры BMP180.

  • Напряжение питания: 3.3 В – 5 В.
  • Рабочий ток: 0.5 мA.
  • Диапазон измеряемого давления:300 гПа. – 1100 гПа.
  • Интерфейс: I2C
  • Время срабатывания: 4.5 мс.
  • Точность измерения давления: 0.1 гектопаскаль
  • Точность измерения температуры: 0.1°С
  • Габариты: 15 мм. х 14 мм.

Общие сведения.

Параметры датчика давления и температуры BMP180.

Давайте рассмотрим данный датчик. В левой части расположен сам сенсорный датчик BMP180 фирмы Bosch. Так как датчик BMP 180 работает от 3.3В (а почти все платы Arduino работают на 5В), на плате предусмотрен стабилизатор напряжения XC6206P332MR в корпусе SOT-23, который выдает на выходе напряжение в 3.3В, рядом установлена обвязка стабилизатора, состоящая из двух керамических конденсаторов на 1 мкФ. Подключение осуществляется по интерфейсу I2C, линии SCL и SDA выведены на группу контактов на другой стороне модуля, туда же выведено и питание. Последние два резистора на 4.7 кОм необходимы для подтяжки линии SCL и SDA к питанию, конечно, при необходимости, их можно выпаять, если используете несколько устройств на I2C линии.

Рассмотрим датчик давления и температуры BMP180 (Digital Pressure Sensor)

Рассмотрим датчик давления и температуры BMP180 (Digital Pressure Sensor)

Датчик поставляется в виде модуля (на печатной плате) с 4 или 5 выводами:

  • если у модуля 4 вывода (VIN GND SCL SDA), то на вывод VIN подаётся питание +3,3в.
  • если у модуля 5 выводов (VIN 3V3 GND SCL SDA), то на вывод VIN подаётся +5в. (так же можно запитать модуль с 5 выводами от 3,3в, подав их на вывод 3V3 оставив вывод VIN свободным)
  • если у модуля 5 выводов с выводом IO или VDDIO, то считайте, что у вашего модуля 4 вывода. Не подавайте +5в!!!

Выводы датчика BMP180:

1 - CS, 2 - VDD, 3 - VDDIO, 4 - MOSI, 5 - CSL (CSLK), 6 - SDA (MISO), 7 - GND.

Датчик имеет возможность передачи данных, используя интерфейсы I2C (выводы: 5-CSL и 6-SDA) или SPI (выводы: 1-CS, 4-MOSI, 5-CSLK и 6-MISO)

В рассматриваемых модулях используется протокол I2C, а значит, выводы 1 и 4 датчика не используются, но должны быть припаяны к плате для симметрии

Виды некоторых модулей с установленным датчиком BMP180:

Виды некоторых модулей с установленным датчиком BMP180

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

Выводы модуля BMP180:

  • VIN (Vcc, Vdd) плюс питания;
  • GND (-) (англ. GrouND) общий (минус питания);
  • SDA (DA) (англ. Serial DAta) линия данных, интерфейс I2C
  • SCL (CL) (англ. Serial CLock) линия тактирования, интерфейс I2C

Принципиальная схема датчика BMP180, показана ниже.

Принципиальная схема датчика BMP180

Подключение датчика давления BMP180 к Arduino.

Необходимые детали:

  • Датчик давления BMP180
  • Arduino UNO
  • Провод DuPont 10x, 2,54 мм.

Подключение датчика давления BMP180 к Arduino:

В данном примере используем датчик BMP 180 и плату Arduino NANO, все полученные показания отправляем в «Монитор порта», в принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате Arduino предусмотрено только два вывода A4 и A5.

 датчик BMP 180 и плату Arduino NANO

Подключение датчика давления BMP180 к Arduino NANO.

Подключение датчика давления BMP180 к Arduino UNO

Подключение датчика давления BMP180 к Arduino UNO.

Теперь, о программной части. Для нашего удобства разработана библиотека BMP180 Breakout Arduino Library, которая позволяет упросить работу с датчиком, скачиваем и устанавливаем ее.

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;                          // Объявляем переменную для доступа к SFE_BMP180

void setup()
{
 Serial.begin(9600);                          // Задаем скорость передачи данных
 Serial.println("REBOOT");                    // Вывод текста "Перезагрузка"

 if(pressure.begin())                         // Инициализация датчика
     Serial.println("BMP180 init success");   // Вывод текста "BMP180 подключен"
   else{                                      // В противном случаи, датчик не подключен
     Serial.println("BMP180 init fail\n\n");  // Вывод текста "BMP180 не подключен"
     while(1);                                // Пауза.
       }
}

void loop()
{
  char status;
  double T,P,p0,a;

/* Так как давление зависит от температуры, надо сначало узнать температуру 
 * Считывание температуры занимает какоето время. 
 * Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд
 * которые нужно подождать. Ксли какае то проблема, то функция вернет 0.
*/

  status = pressure.startTemperature();       // Считывание показания
  if(status!=0){                              // Если значение status не 0, выполняем следующию команду.
     delay(status);                           // Ждем     
     status = pressure.getTemperature(T);     // Полученые показания, сохраняем в переменную T
      if(status!=0){                          // Если все хорошо, функция вернет 1, иначе вернет 0
         Serial.print("Temperature: ");       // Вывод текста "Температура"
         Serial.print(T,2);                   // Вывод показания переменной "Т"
         Serial.println(" C, ");              // Вывод текста "С"

/* Определяем показания атмосферного давления
 * Параметр указывает расширение, от 0 до 3 (чем больше расширение, тем больше точность, тем долше ждать)
 * Если все хорошо, функция pressure.startTemperature вернет status с количеством милисикунд
 * которые нужно подождать. Если какая то проблема, то функция вернет 0.
*/

  status = pressure.startPressure(3);         // Считывание показания
  if(status!=0){                              // Если значение status не 0, выполняем следующию команду.
     delay(status);                           // Ждем
     status = pressure.getPressure(P,T);      // Полученные показания, сохраняем в переменную P
      if(status!=0){                          // Если все хорошо, функция вернет 1, иначе вернет 0 
         Serial.print("Absolute pressure: "); // Вывод текста "Атмосферное давление"
          Serial.print(P,2);                  // Вывод показания переменной mBar
          Serial.print(" mbar, ");            // ПВывод текста "mBar"
          Serial.print(P*0.7500637554192,2);  // Вывод показания в mmHg
          Serial.println(" mmHg");}           // Вывод текста "mmHg"

  else Serial.println("error retrieving pressure measurement\n");}    // Ошибка получения давления
  else Serial.println("error starting pressure measurement\n");}      // Ошибка запуска получения давления
  else Serial.println("error retrieving temperature measurement\n");} // Ошибка получения температуры
  else Serial.println("error starting temperature measurement\n");    // Ошибка запуска получения температуры
  delay(5000);                                                        // Пауза в 5с
}

Загружаем скетч в плату Arduino, и если все правильно подключено, то в окне мониторинга порта можно увидеть температуру и атмосферное давление.

Загружаем скетч в плату arduino,

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

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

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Конденсатор. Принцип работы, основные характеристики. http://portal-pk.ru/news/270-kondensator-princip-raboty-osnovnye-harakteristiki.html Константин Portal-PK 2020-10-29T13:46:00+03:00 Конденсатор — распространенный двухполюсный электронный компонент, главным свойством которого является способность накапливать электрический заряд и «отпускать» его обратно. Процесс накопления заряда называется зарядкой, а процесс его потери – разрядкой.

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

  • Керамические конденсаторы
  • Танталовые конденсаторы
  • Электролитические конденсаторы
  • Конденсаторы переменной емкости

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

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

В простейшем виде конденсатор состоит их двух металлических пластин, называемых обкладками, которые разделены слоем диэлектрика.

В простейшем виде конденсатор состоит их двух металлических пластин

При включении конденсатора в цепь с источником тока, под воздействием электрического поля на одной обкладке накапливается положительный заряд, а на другой – отрицательный. Это будет происходить до тех пор, пока на обкладках не накопится максимально возможное количество заряда. Оно определяется важной характеристикой конденсатора — емкостью. Емкость конденсатора определяется количеством заряда, которое он может накопить при заданном напряжении:

Формула емкости.

Формула емкости

C — емкость конденсатора, q — заряд, U — напряжение.

Емкость зависит от таких физических характеристик, как, например, площадь обкладок, расстояние между ними и диэлектрическая проницаемость диэлектрика. Единицей измерения емкости конденсаторов в международной системе единиц (СИ) является Фарад (Ф).

Чем больше ёмкость, тем больший заряд может удерживать конденсатор при заданном напряжении, и тем меньше скорость его зарядки и разрядки.

Основные параметры конденсаторов:

  • Основной характеристикой конденсатора является его ёмкость, характеризующая способность конденсатора накапливать электрический заряд. В обозначении конденсатора фигурирует значение номинальной ёмкости, в то время как реальная ёмкость может значительно меняться в зависимости от многих факторов. Реальная ёмкость конденсатора определяет его электрические свойства. Так, по определению ёмкости, заряд на обкладке пропорционален напряжению между обкладками. Типичные значения ёмкости конденсаторов составляют от единиц пикофарад до тысяч микрофарад. Однако существуют конденсаторы (ионисторы) с ёмкостью до десятков фарад.
  • Конденсаторы также характеризуются удельной ёмкостью — отношением ёмкости к объёму (или массе) диэлектрика. Максимальное значение удельной ёмкости достигается при минимальной толщине диэлектрика, однако при этом уменьшается его напряжение пробоя.
  • Плотность энергии электролитического конденсатора зависит от конструктивного исполнения. Максимальная плотность достигается у больших конденсаторов, где масса корпуса невелика по сравнению с массой обкладок и электролита.
  • Другой, не менее важной характеристикой конденсаторов является номинальное напряжение — значение напряжения, обозначенное на конденсаторе, при котором он может работать в заданных условиях в течение срока службы с сохранением параметров в допустимых пределах. Номинальное напряжение зависит от конструкции конденсатора и свойств применяемых материалов. При эксплуатации напряжение на конденсаторе не должно превышать номинального. Для многих типов конденсаторов с увеличением температуры допустимое напряжение снижается, что связано с увеличением тепловой скорости движения носителей заряда и, соответственно, снижению требований для образования электрического пробоя.
  • Полярность. Многие конденсаторы с оксидным диэлектриком (электролитические) функционируют только при корректной полярности напряжения из-за химических особенностей взаимодействия электролита с диэлектриком. При обратной полярности напряжения электролитические конденсаторы обычно выходят из строя из-за химического разрушения диэлектрика с последующим увеличением тока, вскипанием электролита внутри и, как следствие, с вероятностью взрыва корпуса.

Основная классификация конденсаторов проводится по типу диэлектрика в конденсаторе. Тип диэлектрика определяет основные электрические параметры конденсаторов: сопротивление изоляции, стабильность ёмкости, величину потерь и др.

По виду диэлектрика различают:

  • Конденсаторы вакуумные (между обкладками находится вакуум).
  • Конденсаторы с газообразным диэлектриком.
  • Конденсаторы с жидким диэлектриком.
  • Конденсаторы с твёрдым неорганическим диэлектриком: стеклянные (стеклоэмалевые, стеклокерамические, стеклоплёночные), слюдяные, керамические, тонкослойные из неорганических плёнок.
  • Конденсаторы с твёрдым органическим диэлектриком: бумажные, металлобумажные, плёночные, комбинированные — бумажноплёночные, тонкослойные из органических синтетических плёнок.
  • Электролитические и оксидно-полупроводниковые конденсаторы. Такие конденсаторы отличаются от всех прочих типов, прежде всего, большой удельной ёмкостью. В качестве диэлектрика используется оксидный слой на металлическом аноде. Вторая обкладка (катод) — это или электролит (в электролитических конденсаторах), или слой полупроводника (в оксидно-полупроводниковых), нанесённый непосредственно на оксидный слой. Анод изготовляется, в зависимости от типа конденсатора, из алюминиевой, ниобиевой или танталовой фольги или спечённого порошка. Время наработки на отказ типичного электролитического конденсатора 3000-5000 часов при максимально допустимой температуре, качественные конденсаторы имеют время наработки на отказ не менее 8000 часов при температуре 105°С. Рабочая температура — основной фактор, влияющий на продолжительность срока службы конденсатора. Если нагрев конденсатора незначителен из-за потерь в диэлектрике, обкладках и выводах, (например, при использовании его во времязадающих цепях при небольших токах или в качестве разделительных), можно принять, что интенсивность отказов снижается вдвое при снижении рабочей температуры на каждые 10 °C вплоть до +25 °C. Твердотельные конденсаторы — вместо традиционного жидкого электролита используется специальный токопроводящий органический полимер или полимеризованный органический полупроводник. Время наработки на отказ ~50000 часов при температуре 85°С. ЭПС меньше чем у жидко-электролитических и слабо зависит от температуры. Не взрываются.

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

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

При последовательном соединении конденсаторов уменьшается общая емкость и увеличивается общее напряжение конденсаторов. Общая емкость при последовательном соединении конденсаторов будет вычисляться по формуле:

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

Общее напряжение будет равняться сумме напряжений всех конденсаторов.

Например: мы имеем три конденсатора по 30 мкФ x 100 В каждый. При их последовательном соединении общий конденсатор будет иметь следующие данные: 10 мкФ x 300 В.

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

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

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

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

Например: мы имеем три конденсатора 30 мкФ x 100 В, соединённые параллельно. Параметры всего набора конденсаторов в этом случае будут следующие: 90 мкФ x 100 В.

Соединение более двух конденсаторов последовательно редко встречается в реальных схемах. Хотя для увеличения общего напряжения такой набор может встретиться в высоковольтных источниках питания. А вот в низковольтных источниках довольно часто встречается параллельное соединение нескольких конденсаторов для сглаживания пульсаций после выпрямления при больших токах потребления.

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

Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Обзор драйвера шагового двигателя DRV8825 и A4988. http://portal-pk.ru/news/269-obzor-draivera-shagovogo-dvigatelya-drv8825-i--a4988.html Константин Portal-PK 2020-10-07T15:01:41+03:00 На моем новом сайте про ЧПУ станки и ЧПУ технологии (CNC-tex.ru) вышли две новые статьи про драйвера шаговых двигателей DRV8825 иA4988.

драйвера шаговых двигателей DRV8825 иA4988

Драйвера DRV8825 иA4988 широко применяются в разработке ЧПУ станков различного назначения. Начиная от простых плоттеров для рисования и выкройки ткани и рекламной плёнки, до более сложных станков, таких как настольные фрезерные станки с ЧПУ. Кстати, данные драйвера также используются в 3D принтерах. Но последнее время использовать данные драйвера для управления шаговыми двигателями в 3D принтерах стали редко. Это связанно с тем, что DRV8825 иA4988 имеют небольшое деление шага A4988 максимум 1/16, а DRV8825 1/32. Также новые версии драйверов, например TMC-2208, обеспечивают более тихую работу шаговых двигателей.

Подробную информацию и техническое описание драйвера A4988

Подробную информацию и техническое описание драйвера A4988 читайте тут:

Драйвер шагового двигателя A4988.

Подробную информацию и техническое описание драйвера DRV8825

Подробную информацию и техническое описание драйвера DRV8825 читайте тут:

Драйвер шагового двигателя DRV8825. Подключение к Arduino.

Также рекомендую к прочтению Плата расширения для Arduino UNO, CNC shield v3 и драйверов A4988.

Если вы планируете собрать самостоятельно ЧПУ станок, то читайте

ЧПУ станок своими руками на базе arduino. Пошаговая инструкция + видео

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

И всем пока-пока.

До встречи в следующей статье.

]]>
6 частых ошибок начинающих предпринимателей, и способы их избежать http://portal-pk.ru/news/268-6-chastyh-oshibok-nachinayushchih-predprinimatelei-i-sposoby.html Константин Portal-PK 2020-09-16T07:38:59+03:00

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


1.Использование чужой интеллектуальной собственности

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

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


2. Переоценка собственных возможностей

Предприниматели, даже начинающие, как правило, много знают и еще больше умеют. Они часто думают: «В этом нет ничего сложного, я, наверняка, сам смогу…». В четырех случаях из пяти это оказывается правдой. Но когда вы запускаете собственный бизнес, повторяйте, как мантру следующие слова: «Я не могу делать все, и не должен/не должна этого делать». Ваше время и энергия должны быть посвящены задачам, которые можете выполнять только вы как владелец бизнеса.

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


3. Упущение момента

Многие предприниматели склонны к перфекционизму. И вы тоже, если требуете лучшее из возможного, а оценка «достаточно хорошо» вас не устраивает. Но стремление к идеальному во всем способно убить бизнес. Подождите еще немного, и момент будет упущен. Например, если вы ищите место для своего кафе, рассматриваете варианты, но никак не выберете лучшее. Эксперты часто называют подобный образ мыслей «аналитическим параличом». Страх принять неверное решение буквально не дает двигаться вперед. Но дело в том, что играть в игру «а что, если…» можно бесконечно, так ни на что и не решившись.

Как избежать? Дайте себе время принять решение, но установите жесткие рамки. Например, два дня или одну неделю. А затем смело принимайте одну из сторон, - в конце концов, решитесь купить офис в Рязани (регион приведен в качестве примера) - и открывайтесь.



4. Работать non-stop

Запуск своего бизнеса требует много времени и сил. С этим никто не спорит. Однако ваша жизнь вне стен рабочего кабинета не должна на этом заканчиваться. Даже в самые напряженные дни не пренебрегайте семьей, а также собственным психическим и физическим здоровьем. Всегда помните, ради чего или кого вы все это затеяли.

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


5. Сокращение неоправданных затрат

Какие статьи расходов сокращают предприниматели в первую очередь в кризис? Рекламу? Юридический отдел? В регионах многие компании оставили сотрудников на удалёнке. Но будьте осторожны, урезая бюджеты. Независимо от того, сколько денег это поможет сэкономить вам прямо сейчас, в конечном итоге вы можете заплатить намного больше. Если бизнес только развивается, вам более чем нужны и маркетологи, и юристы, не говоря уже о самом насущном вопросе - аренде офиса в Рязани (город опять же упомянут в качестве примера) или в другом актуальном для вас регионе.

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


6. Стремление быть всем для всех

Если вы уверены, что ваш продукт захотят все, или ваша целевая аудитория – граждане страны старше 21 года, - выдохните и сделайте паузу. Возможно, поначалу будет казаться, что неважно, кто это купит, лишь бы денег в кассе становилось больше. Но секрет роста продаж не в расширении цели продукта или услуги. Стоит сосредоточиться на сильных сторонах и сузить нишу.

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

]]>
Резистор http://portal-pk.ru/news/267-rezistor.html Константин Portal-PK 2020-07-26T15:28:54+03:00 Резистор — искусственное «препятствие» для тока. Сопротивление в чистом виде. Резистор ограничивает силу тока, переводя часть электроэнергии в тепло. Сегодня невозможно изготовить ни одно, сколько-нибудь функционального, электронного устройства без резисторов. Они используются везде: от компьютеров, до небольших проектов на Arduino.

Резистор — искусственное «препятствие» для тока. Сопротивление в чистом виде.

Сопротивление резистора — его основная характеристика. Основной единицей электрического сопротивления является Ом. На практике используются также производные единицы — килоом (кОм), мегаом (МОм), гигаом (ГОм), которые связаны с основной единицей следующими соотношениями:

1 кОм = 1000 Ом,
1 МОм = 1000 кОм,
1 ГОм = 1000 Мом

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

Ниже на рисунке видна маркировка резисторов на схемах:

Ниже на рисунке видна маркировка резисторов на схемах:

Наклонные линии обозначают мощность резистора до 1 Вт. Вертикальные линии и знаки V и X (римские цифры), указывают на мощность резистора в несколько Ватт, в соответствии со значением римской цифры.

Для соединения резисторов в схемах используются три разных способа подключения: параллельное, последовательное и смешанное. Каждый способ обладает индивидуальными качествами, что позволяет применять данные элементы в самых разных целях.

Разные типы соединений нужны для подбора сопротивления, если нет в наличии нужного наминала, или нужен резистор большей мощности.


Последовательное соединение резисторов.

Последовательное соединение резисторов применяется для увеличения сопротивления. То есть, когда резисторы соединены последовательно, общее сопротивление равняется сумме сопротивлений каждого резистора. Например, если резисторы R1 и R2 соединены последовательно, их общее сопротивление высчитывается по формуле:

Rобщ = R1 + R2

Это справедливо и для большего количества соединённых последовательно резисторов:

Rобщ = R1 + R2 + R3 + … + Rn

Цепь из последовательно соединённых резисторов будет всегда иметь сопротивление большее, чем у любого резистора из этой цепи.

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

Мощность при последовательном соединении.

При соединении резисторов последовательно электрический ток по очереди проходит через каждое сопротивление. Значение тока в любой точке цепи будет одинаковым. Данный факт определяется с помощью закона Ома. Если сложить все сопротивления, приведенные на схеме, то получится следующий результат:

R = 200 + 100 + 51 + 39 = 390 Ом

Мощность при последовательном соединении

Учитывая напряжение в цепи, равное 100 В, по закону Ома сила тока будет составлять

I = U/R = 100 В/390 Ом = 0,256 A

На основании полученных данных можно рассчитать мощность резисторов при последовательном соединении по следующей формуле:

P = I2 x R = 0,2562 x 390 = 25,55 Вт

Таким же образом можно рассчитать мощность каждого отдельно взятого резистора:

P1 = I2 x R1 = 0,2562 x 200 = 13,11 Вт;
P2 = I2 x R2 = 0,2562 x 100 = 6,55
Вт;
P3 = I2 x R3 = 0,2562 x 51 = 3,34
Вт;
P4 = I2 x R4 = 0,2562 x 39 = 2,55
Вт
.

Если сложить полученные мощности, то общая Р составит:

Робщ = 13,11 + 6,55 + 3,34 + 2,55 = 25,55 Вт

Параллельное соединение резисторов.


Параллельное соединение резисторов

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

Расчет параллельного сопротивления двух параллельно соединённых резисторов R1 и R2 производится по следующей формуле:

Rобщ = (R1 × R2) / (R1 + R2)

Параллельное соединение трёх и более резисторов требует более сложной формулы для вычисления общего сопротивления:

1 / Rобщ = 1 / R1 + 1 / R2 + … + 1 / Rn

Сопротивление параллельно соединённых резисторов будет всегда меньше, чем у любого из этих резисторов.

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

Мощность при параллельном соединении.

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

1/R = 1/200 + 1/100 + 1/51 + 1/39 ≈ 0,06024 Ом
R = 1 / 0,06024 ≈ 16,6 Ом

Мощность при параллельном соединении

Используя значение напряжения 100 В, по закону Ома рассчитывается сила тока

I = U/R = 100 В x 0,06024 Ом = 6,024 A

Зная силу тока, мощность резисторов, соединенных параллельно, определяется следующим образом

P = I2 x R = 6,0242 x 16,6 = 602,3 Вт

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

I1 = U/R1 = 100/200 = 0,5 A;
I2 = U/R2 = 100/100 = 1 A;
I3 = U/R3 = 100/51 = 1,96 A;
I4 = U/R4 = 100/39 = 2,56 A

На примере этих сопротивлений прослеживается закономерность, что с уменьшением сопротивления, сила тока увеличивается.

Существует еще одна формула, позволяющая рассчитать мощность при параллельном подключении резисторов:

P1 = U2/R1 = 1002/200 = 50 Вт;
P2 = U2/R2 = 1002/100 = 100 Вт;
P3 = U22/R3 = 1002/51 = 195,9 Вт;
P4 = U22/R4 = 1002/39 = 256,4 Вт

Если сложить полученные мощности, то общая Р составит:

Робщ = 50 + 100 + 195,9 + 256,4 = 602,3 Вт

Цветовая маркировка резисторов.

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

Цветовая маркировка резисторов

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

Если же вы увлекаетесь ЧПУ станками, данные знания тоже будет не лишними.

Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Лазерный станок с ЧПУ с АлиЭкспресс http://portal-pk.ru/news/266-lazernyi-stanok-s-chpu-s-aliekspress.html Константин Portal-PK 2020-07-19T08:56:35+03:00 Мое увлечение ЧПУ станками началось больше 3 лет. Все это время я собирал самодельные ЧПУ станки. Сегодня я буду собирать заводской лазерный станок с ЧПУ, купленный на АлиЭкспресс. У вас, наверное, возник вопрос что случилось? Почему заводской, а не самодельный станок с ЧПУ?

Все просто: сочетание прагматичности, логики и немного лени.

Более подробное описание смотрите на моем втором сайте X-TEX.

Дело обстояло так. Попался на сайте АлиЭкспресс автономный лазерно-гравировальный ЧПУ станок с рамой из алюминиевых профилей.

Дело обстояло так. Попался на сайте АлиЭкспресс автономный лазерно-гравировальный ЧПУ станок с рамой из алюминиевых профилей. Посчитал, если покупать все комплектующие, то стоимость будет не многим меньше. А времени потрачу на сборку достаточно много.Вы считает, что собрать такую раму не сложно? Но спешу вас огорчить. Кроме того чтобы нарезать профиль нужно еще сделать резьбу. Также нужен чертёж всех деталей, которые сделаны из акрила. А затем это все вырезать. Но тут тоже нужен подходящий материал. Я заказывал станок в начале карантина. А в начале купить комплектующие для сборки самодельного ЧПУ станка было проблематично. Это было еще одним фактором, который повлиял на покупку заводского станка.

Сборка Лазерного станка с ЧПУ с АлиЭкспресс.

Сборку произвожу по инструкции, которая идет в комплекте со станком. Кстати, инструкцию перевел и немного доработал:Инструкция по сборке лазерно-гравировального станка CNC2-6550.

Сборку произвожу по инструкции

Собираем раму.

Собираем раму.Собираем каретки станка.

Собираем каретки станка.

Ставлю все на место.

Ставлю все на место.

Натягиваем ремни.

Натягиваем ремни.

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

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

Можно запускать.

Запуск Лазерного станка с ЧПУ с АлиЭкспресс.

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

Благодаря пульту управления станком можно управлять и без компьютера

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

Возможности пульта управления Лазерного станка с ЧПУ с АлиЭкспресс.

  • Перемещение по осям.
  • Включение и выключение лазера при нажатии кнопки.
  • Выбор файла с карты памяти и автономная работа.


Минусом пульта является невозможность перехода из перемещения осями в выбор файла.

Минусом пульта является невозможность перехода из перемещения осями в выбор файла.

Пример гравирования на Лазерном станке с ЧПУ.

На карте памяти есть несколько файлов для гравировки. Можно запустить и проверить работу станка. Как видим, станок работает, но очень медленно и прожигает сильно. Это связано с тем, что примеры с карты памяти рассчитаны на более слабый лазер.

Пример гравирования на Лазерном станке с ЧПУ.

Но для проверки работоспособности достаточно.

Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Что такое макетная плата и как ей пользоваться? http://portal-pk.ru/news/265-chto-takoe-maketnaya-plata-i-kak-ei-polzovatsya.html Константин Portal-PK 2020-07-13T19:25:05+03:00 Для чего нужна макетная плата?

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

Прототип — это работающая модель устройства. Именно для прототипированя нам и понадобится макетная плата.

Прототип — это работающая модель устройства. Именно для прототипированя нам и понадобится макетная плата.

Беспаечные макетные платы (breadboard).

Видов беспаечных макетных плат существует множество. Они различаются количеством выводов, количеством шин, конфигурацией, но устроены все они по одному принципу. Макетная плата состоит из пластикового основания с множеством отверстий, расположенных обычно со стандартным шагом 2,54 мм. С таким же шагом обычно располагаются ножки у выводных микросхем. Отверстия нужны для того, чтобы вставлять в них выводы радиоэлементов или соединительные провода. Типичный вид макетной платы представлен на рисунке.

Беспаечные макетные платы (breadboard).

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

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

Каждая металлическая пластина имеет вид, приведенный на рисунке ниже. То есть, это не просто пластина, а пластина с клипсами, которые прячутся в пластиковой части монтажной платы. Именно в эти клипсы вы подключаете ваши провода.

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

Обратите внимание, что на одной рельсе пять клипс. Это общепринятый стандарт. Большинство беспаечных макетных плат реализуются именно таким образом. То есть, вы можете подключить до пяти компонентов включительно к отдельной рельсе на breadboard’е и они будут связаны между собой. Но ведь на плате десять отверстий в ряду! Почему мы ограничены пятью контактами? Вы, наверное, обратили внимание, что по центру монтажной платы есть отдельная рельса без пинов? Эта рельса изолирует пластины друг от друга.

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

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

Теперь рассмотрим макетные платы на 400 контактов. На таких платах, как правило, предусматривают две вертикально расположенные рельсы. Так называемые рельсы для питания.

\Теперь рассмотрим макетные платы.

Эти рельсы аналогичны по исполнению с горизонтальными, но при этом соединены друг с другом по всей длине. При разработке проекта вам часто необходимо питание для многих компонентов. Именно эти рельсы используются для питания. Обычно их отмечают «+» и «-» и двумя разными цветами — красным и голубым. Как правило, рельсы соединяют между собой, чтобы получить одинаковое питание по обеим сторонам макетной платы (смотрите на рисунке ниже). Кстати, нет необходимости подключать плюс именно к рельсе с обозначением «+», это исключительно подсказка, которая поможет вам структурировать ваш проект.

это исключительно подсказка, которая поможет вам структурировать ваш проект.


Центральная рельса без контактов изолирует две стороны беспаечной монтажной платы. Помимо изоляции, эта рельса выполняет вторую важную функцию. Большинство микросхем (ICs), изготавливаются в стандартных размерах. Для того, чтобы они занимали минимум места на монтажной плате, используется специальный форм-фактор под названием Dual in-line Package, или сокращенно – DIP.

У DIP-микросхем контакты расположены по двум сторонам и отлично садятся на две рельсы по центру макетной платы. Именно в этом случае изоляция контактов – отличный вариант, который позволяет сделать разводку каждого контакта микросхемы на отдельную рельсу с пятью контактами.

На рисунке ниже показана установка двух DIP микросхем. Сверху – LM358, ниже – микроконтроллер ATMega328, который используется во многих платах Arduino.

установка двух DIP микросхем. Сверху – LM358, ниже – микроконтроллер ATMega328

Наверняка вы обращали внимание, что на беспаечных монтажных платах нанесены числа и буквы возле строк (горизонтальных рельс) и столбцов (вертикальных рельс). Эти обозначения нанесены исключительно для удобства. Прототипы ваших устройств очень быстро обрастают дополнительными компонентами, а одна ошибка в подключении приводит к неработоспособности электрической схемы или даже к выходу из строя отдельных компонентов. Гораздо проще подключить контакт к рельсе, которая отмечена цифрой и буквой, чем отсчитывать контакты “на глаз”.

Breadboard также не заменив при изучении Arduino.

Breadboard также не заменив при изучении Arduino. В моих уроках устанавливаю на маетную плату Arduino NANO и устанавливаю на макетную плату все необходимые элементы. Затем все соединяю соединительными проводами.


Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Самодельные динамики для монитора с регулировкой громкости. http://portal-pk.ru/news/264-samodelnye-dinamiki-dlya-monitora-s-regulirovkoi.html Константин Portal-PK 2020-07-01T04:00:54+03:00 В период самоизоляции, когда все было достаточно строго, у меня сломались колонки для компьютера. Заказал новые, но доставят через неделю, работать надо сейчас. Решил сделать себе самодельные динамики для монитора. Благо все комплектующие были в наличии.

Если у вас все в порядке с компьютерными колонками но, нужен сервер, дедик или VPS. Купить сервер, дедик, VPS можно на сайте vpserver.pro.

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

В наличии были 2 усилителя PAM8403 DC 5v 2 канала. Один с регулятором громкости, второй пассивный. Использовать решил плату с регулировкой громкости, постоянно регулировать громкость на компьютере неудобно.

2 усилителя PAM8403 DC 5v 2

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

Питание подавать через USB провод

Динами взял от старого нерабочего ноутбука. Я их часто использую в своих проектах со звуком, например при создании MP3-плеера на DFPlayer Mini и Arduino.

Для сборки понадобится клеевой пистолет, паяльник.

К сборке все готово, можно приступать к работе.

Сборка самодельных колонок для монитора.

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

Сборка самодельных колонок для монитора.

Собирал все по схеме.

Собирал все по схеме.

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

Все работает! Звук регулируется, но конечно желает лучшего. Но на несколько дней работы достаточно.

Установка динамиков на монитор.

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

Установка динамиков на монитор.

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

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

Мое мнение об усилители PAM8403.

Усилитель не очень мощный и при этом чувствителен к помехам. Если вам нужно сделать оповещение или уведомления, усилитель PAM8403 подойдёт отлично, но для реализации устройства, которое будет воспроизводить аудио или звук из видео, то это сомнительное решение. Не смотря на это, самодельные динамики я сделал и установил нам монитор и пользовался некоторое время, по причине отсутствия другого решения.

Мое мнение об усилители PAM8403.

Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Изучаем Arduino без Arduino c помощью Tinkercad и его сервиса Схемы. http://portal-pk.ru/news/263-izuchaem-arduino-bez-arduino-c-pomoshchyu-tinkercad-i-ego-servisov.html Константин Portal-PK 2020-06-04T15:48:14+03:00 С каждым годом робототехника становиться популярнее. Для разработки роботов и простых проектов используется платформа Arduinо, но для изучения данной платформы нужно купить Arduino UNO или NANO, резисторы, светодиоды, соединительные провода, макетную плату, сервоприводы, двигателя, дисплей, реле, датчики и сенсоры. Начальное вложение от 2 т. руб. при покупке минимального Arduino набора на Aliexpress. Если покупать в наших магазинах стоимость может быть в 2-3 раза больше. Стоит ли покупать железки для изучения робототехники? На данный вопрос можно ответить, попробовав свои силы в сборке схем и программировании Arduino в Tinkercadи его сервисе Circuits.

 сборке схем и программировании Arduino в Tinkercad и его сервисе Circuits.

Что такое Tinkercad?

Tinkercad - графический редактор, предназначенный для создания и печати трехмерных моделей.

Tinkercad - графический редактор, предназначенный для создания и печати трехмерных моделей.

Главным преимуществом программы, по сравнению с другими CAD-редакторами, является то, что она представлена в виде онлайн-приложения, и не требует установки на компьютер. Сервисом можно пользоваться прямо в веб-браузере благодаря технологии WebGL, позволяющей отображать трехмерную графику в интернет-обозревателях.

Онлайн-сервис Tinkercad полностью бесплатный, русифицирован, имеет простой интерфейс, понятный даже новичкам, не требует установки дополнительных плагинов и поддерживает работу со всеми основными браузерами (Chrome, Firefox, Opera и другие). CAD-редактор позволяет сохранять готовые проекты на сервере разработчика или на жестком диске компьютера в виде OBJ и STL-файлов, а также обладает возможностью печати моделей.

Tinkercad позиционирует себя как сервис робототехники для начинающих. Изучать схемотехнику и программирование Arduino помогает раздел Схемы.

Tinkercad Arduino

Tinkercad Arduino

Тинкеркад (Tinkercad Circuits Arduino) – бесплатный, удивительно простой и одновременно мощный эмулятор Arduino, с которого можно начинать обучение электронике и робототехнике. Он предоставляет очень удобную среду для написания своих проектов. Не нужно ни чего покупать, ни чего качать — все доступно онлайн. Единственное, что от вас потребуется — зарегистрироваться.

Возможности симулятора Tinkercad для разработчика Arduino.

Возможности симулятора Tinkercad для разработчика Arduino.

  • Онлайн платформа, для работы не нужно ничего кроме браузера и устойчивого интернета.
  • Удобный графический редактор для визуального построения электронных схем.
  • Предустановленный набор моделей большинства популярных электронных компонентов, отсортированный по типам компонентов.
  • Симулятор электронных схем, с помощью которого можно подключить созданное виртуальное устройство к виртуальному источнику питания и проследить, как оно будет работать.
  • Симуляторы датчиков и инструментов внешнего воздействия. Вы можете менять показания датчиков, следя за тем, как на них реагирует система.
  • Встроенный редактор Arduino с монитором порта и возможностью пошаговой отладки.
  • Готовые для развертывания проекты Arduino со схемами и кодом.
  • Визуальный редактор кода Arduino.
  • Возможность интеграции с остальной функциональностью Tinkercad и быстрого создания для вашего устройства корпуса и других конструктивных элементов – отрисованная модель может быть сразу же сброшена на 3D-принтер.
  • Встроенные учебники и огромное сообщество с коллекцией готовых проектов

Начало работы в Tinkercad Arduino.

Начало работы в Tinkercad Arduino.

Найти Tinkercad достаточно просто. Для этого в поисковой системе указываем Тинкеркад. Заходим на сайт с доменом tinkercad.com. Для того, чтобы начать пользоваться сервисом нужно авторизоваться или зарегистрироваться.

авторизоваться или зарегистрироваться

Регистрация в Tinkercad.

Для того, чтобы зарегистрироваться нажимаем кнопку Присоединиться. Регистрация доступна по E-mail или с помощью учтённой записи Google или Apple.

Регистрация в Tinkercad.

При регистрации с использованием E-mail нужно указать вашу страну, дату рождения, свой E-mail и пароль.

При регистрации с использованием E-mail нужно указать вашу страну

При входе с помощью учтённой записи Google или Apple достаточно разрешить использование сервисом Tinkercad данных для авторизации. Но не забывайте, что у вас должен быть создан аккаунт в данной системе и вы должны быть авторизованы.

Создание первой схемы в Circuits.

Создание первой схемы в Circuits.

После авторизации в сервисе вы попадете в раздел 3D-проектирования. Для создания схем нам нужно перейти в раздел Circuits. Чтобы создать электрическую цепь нужно нажать на кнопку Создать цепь.

Для создания схем нам нужно перейти в раздел Circuits.

После чего нам откроется рабочая область в которой:

  • Название проекта;
  • Меню управления;
  • Панель компонентов;
  • Рабочее поле.

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

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

Программирование Arduino в Tinkercad.

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

Программирование Arduinoв Tinkercad.

После нажатия Начать моделирование. Мы увидим мигание светодиода на плате Arduino. Мигать светодиод заставляет тестовая программа, которая создается автоматически при добавлении Ардуино на рабочее поле.

Встроенный светодиодподключен к 13 пину Арудино.

Давайте подключим внешний светодиод. Для этого установим светодиод и резистор на макетную плату. Подключим все по схеме. Встроенный светодиодподключен к 13 пину Арудино. Подключим внешний светодиод к тому же пинуи увидим синхронное мигание встроенного и внешнего светодиода.

Примеры реализации проектов на Arduino.

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

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

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

Защита от ошибок новичка.

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

Защита от ошибок новичка.

При сборе схем в Tinkercad Circuits вы защищены от основных ошибок новичка. Например, если вы подключите светодиод без резистора, то вы увидите предупреждение о том, что ток превышен, что может привести к быстрому выходу из строя светодиода.

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

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

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

Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступать в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Инструкция по сборке лазерного гравировального станка CNC2-6550. http://portal-pk.ru/news/262-instrukciya-po-sborke-lazernogo-gravirovalnogo.html Константин Portal-PK 2020-06-02T07:19:41+03:00

CNC2-6550

Part A: Инструкция по сборке лазерного гравировального станка.

Инструкция по сборке лазерного гравировального станка.

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

Краткая инструкция по использованию программы LaserGRBL.

Видео по сборке и запуску станка будет доступно в ближайшее время!

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

Инструкция по сборке лазерного гравировального станка.

2. Направляющие для портала.

2. Направляющие для портала.

3. Направляющие для портала, и установка двигателя для перемещения по оси Y.


Направляющие для портала, и установка двигателя для перемещения по оси Y.

4. Сборка каретки и установка лазера.

Сборка каретки и установка лазера.

5. Сборка портала лазерного гравировального станка.

Сборка портала лазерного гравировального станка.

6. Установка ножек станка.

 Установка ножек станка.

7. Установка 4-ой ножки станка с платой управления.

Установка 4-ой ножки станка с платой управления.


8.Y-ось: длина ремня: 765 мм x2 шт.

X-ось: длина ремня: 790 мм x1 шт

Y-ось: длина ремня



Подключение станка к компьютеру и автономное использование с внешним дисплеем

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

Управлять станком CNC2-6550 можно через компьютер или с дисплея. В комплекте идет карта памяти на 1 Гб, что позволяет управлять станком без использования ПК.

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

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

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

Если вы работаете без подключения к компьютеру, подключать USB провод не нужно!

CH340SER2. Установка драйвера. Вместе с инструкцией на флешке есть файл CH340SER.exe

Кликаем по нему 2 раза. И устанавливаем.


Кликаем по нему 2 раза. И устанавливаем.


3. Чтобы определить COM-порт вашего станка нужно:

• Windows XP: щелкните правой кнопкой мыши «Мой компьютер», выберите «Свойства», выберите «Диспетчер устройств».

• Windows 7: нажмите «Пуск» -> щелкните правой кнопкой мыши «Компьютер» -> выберите «Диспетчер устройств» -> «Порты (COM и LPT)»

• Вашим устройством будет последовательный порт USB (COMX), где «X» представляет номер COM, например COM5.

• Если имеется несколько последовательных USB-портов, щелкните каждый из них правой кнопкой мыши и проверьте производителя, выбрать нужно «CH340».

Чтобы определить COM-порт вашего станка нужно

4.0. Использование вместе с программой LaserGRBL (есть на USB флешке)

 Использование вместе с программой LaserGRBL

4.1. Используйте USB-кабель для подключения к компьютеру. (Не подключайте при автономной работе!)


Используйте USB-кабель для подключения к компьютеру. (Не подключайте при автономной работе!)

  • Если все удачно подключилось, то вы увидите надпись ” Grbl 1.1f ['$' for help]”.
  • Если выбран неверный порт, то данное сообщение вы не увидите.

4.2. Фокусировка лазера.

Фокусировка лазера.

Лазер нужно сфокусировать, для этого поверните объектив, чтобы минимизировать пятно. Работать с лазером нужно в защитных очках.

Лазер нужно сфокусировать, для этого поверните объектив, чтобы минимизировать пятно. Работать с лазером нужно в защитных очках.


4.3. ИМПОРТ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

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

Его можно вызвать из меню "Файл, Открыть файл", выбрав изображение типа jpg, png или bmp.

4.3. ИМПОРТ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

Его можно вызвать из меню "Файл, Открыть файл", выбрав изображение типа jpg, png или bmp.

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

Обратите внимание: скорость и значение S отличаются для разных материалов.

Обратите внимание: скорость и значение S отличаются для разных материалов.

4.5. Сохраните программу в файл "NC", если вы используете автономный контроллер.


Сохраните программу в файл "NC", если вы используете автономный контроллер.


Автономный контроллер можно использовать в качестве считывателя карт через USB-кабель.

  • Автономный контроллер можно использовать в качестве считывателя карт через USB-кабель.
  • Затем подключите автономный контроллер к плате управления. (Не подключайте USB-кабель к компьютеру)

 Затем подключите автономный контроллер к плате управления. (Не подключайте USB-кабель к компьютеру)

  • Затем. См. ”руководство пользователя автономного контроллера", чтобы начать работу.

ЭКСПЕРТНЫЙ РЕЖИМ

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

1. Режим Постоянной Мощности Лазера М3.(режим по умолчанию)

* Режим постоянной мощности лазера просто сохраняет мощность лазера запрограммированной, независимо от того, движется ли машина, ускоряется или останавливается. Это обеспечивает лучший контроль состояния лазера. При хорошей программе G-кода это может привести к снижению времени при работе со сложными материалами.

ПРИМЕЧАНИЕ: M3 можно использовать, чтобы держать лазер включенным для фокусировки.

2. Динамический режим мощности лазера M4

Режим динамической мощности лазера автоматически регулирует мощность лазера, в зависимости от текущей скорости, относительно запрограммированной частоты. Это, по существу, гарантирует, что количество лазерной энергии вдоль разреза остается неизменным, даже если машина может быть остановлена или активно ускоряться. Это очень полезно для чистой, точной гравировки и резки простых материалов в широком диапазоне методов генерации G-кода программами CAM. Как правило, он будет работать быстрее и может быть все, что вам нужно использовать.

Grbl рассчитывает мощность лазера, исходя из предположения, что мощность лазера линейна по скорости и материалу. Часто это не так. Лазеры могут резать по-разному при разных уровнях мощности, и некоторые материалы могут плохо резать при определенной скорости и / или мощности. Короче говоря, это означает, что режим динамического питания может работать не во всех ситуациях. Всегда делайте пробный образец, прежде чем использовать его с новым материалом или машиной.

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

Откройте «Режим динамической мощности лазера M4» в программном обеспечении LaserGRBL.

Примечание. Лазер включается только при движении машины.

Режим Постоянной Мощности Лазера М3.

3. Пользовательская кнопка

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

Пользовательская кнопка

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

Существует 3 типа пользовательских кнопок:

  • Button
  • TwoStateButton
  • PushButton

Пользовательская кнопка типа «Button» содержит блок кода GCode, который будет выполнен при нажатии. Это можно использовать для запуска серии инструкций gcode, то есть для трассировки кадра вокруг изображения или установки новой нулевой позиции.

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

«TwoStateButton» содержит два блока GCode. Первое действие выполняется при первом щелчке, затем второе действие выполняется при втором щелчке. Это очень полезно для таких действий, как включение / выключение лазера, чтобы увидеть его положение Включить / выключить лазер.

«TwoStateButton» содержит два блока GCode.«PushButton» похож на «TwoStateButton», но первое действие выполняется при наведении мыши, второе - при нажатии мыши. Пользовательские кнопки поддерживают ряд переменных, которые можно использовать в выражениях. Вот полный набор поддерживаемых переменных:

«PushButton» похож на «TwoStateButton», но первое действие выполняется при наведении мыши

4. Конфигурация по умолчанию


Конфигурация по умолчанию


Видео по сборке и запуску станка будет доступно в ближайшее время!

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Скачать инструкцию в формате PDF можно по ссылке внизу статьи: инструкция для лазерного гравировального станка CNC2-6550 на русском.

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

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

]]>
Что такое светодиод? Как подключить к Arduino? http://portal-pk.ru/news/261-chto-takoe-svetodiod-kak-podklyuchit-k-arduino.html Константин Portal-PK 2020-05-19T10:53:51+03:00 Для реализации многих проектов на Arduino используются светодиоды. А для изучения Ардуино светодиод является не заменимым инструментом. Для изучения основ Arduino на сайте есть целый блок уроков, который так и называться: Уроки Arduino: Светодиоды, Резисторы, Arduino.

Что такое резистор рассмотрим в следующий раз.

Что же такое светодиод и как он работает?

Светодиод — вид диода, представляет собой полупроводниковый прибор, способный излучать свет при пропускании через него электрического тока в прямом направлении, от анода (+) к катоду (-).

Что же такое светодиод и как он работает?

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

  1. анод (+) светодиода имеет более длинную ножку;
  2. со стороны катода, корпус светодиода немного срезан.

В современной микроэлектронике применяются миниатюрные светодиоды для поверхностного монтажа (SMD). Такие индикаторы, например, имеются на Arduino Uno для информирования пользователя о состоянии системы.

Такие индикаторы, например, имеются на Arduino Uno для информирования пользователя о состоянии системы.


Подключение Светодиода к Arduino.

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

Подключение Светодиода

Подключение Светодиода к Arduino.

Подключим например к пину 3 платы Arduino. Наша программа примет вот такой вид.

/*
  Зажигаем светодиод на одну секунду, затем выключаем его на  
  одну  секунду в цикле.
 */
void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(3, OUTPUT);   
}
void loop() {
  digitalWrite(3, HIGH);   // зажигаем светодиод
  delay(1000);              // ждем 3 секунды
  digitalWrite(3, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}

Подробнее: Урок 2 – Мигаем светодиодом на Arduino

Расчеты для выбора резистора и мощности светодиода.

Рассмотрим основные расчеты схемы подключения светодиода к Arduino. Возьмём светодиод, круглый 5 мм, – полупроводниковый источник света с рабочим напряжением от 1.9в до 3.4в и силой тока в 20мА.

Рассчитаем, какой резистор R в приведённой схеме нам нужно взять, чтобы получить оптимальный результат. Предположим, что у нас такой светодиод имеет рабочее напряжения 3.3 В и источник питания Arduino 5в:

VF = 3.3 В
I = 20 мА
Vcc = 5 В

Найдём оптимальное сопротивление R и минимально допустимую мощность резистора PR.

Сначала рассчитаем, какое напряжение должен взять на себя резистор:

UR = Vcc – VF = 5 В – 3.3 В = 1.7 В

По закону Ома найдём значение сопротивления, которое обеспечит такое падение:

R = UR / I = 1.7 В / 0.02 А = 85 Ом

Таким образом:

  • при сопротивлении более 85 Ом яркость будет ниже заявленной;
  • при сопротивлении менее 85 Ом срок жизни светодиода будет меньше.

Далее рассчитаем мощность, которую при этом резистору придётся рассеивать:

PR = I2 × R = (0.02 А)2 × 85 Ом = 0.034 Вт

Это означает, что при мощности резистора менее 34 мВт резистор перегорит.

Данные расчеты проводить не обязательно, есть онлайн калькуляторы. Также при разработке проектов используют стандартные наборы резисторов от 100 Ом до 220 Ом. Чтобы продлить срок службы резистора, чаще всего, используют 220 Ом.


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

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

]]>
Вторая модернизация (доработка) 3D принтера Anet A8. http://portal-pk.ru/news/260-vtoraya-modernizaciya-dorabotka-3d-printera-anet-a8.html Константин Portal-PK 2020-05-14T08:05:36+03:00 При разработке самоделок и проектов на Arduino не обойтись без 3D принтера. Купил я себе недорогой 3D принтер Anet A8. Принтер бюджетный, поэтому есть недочёты, чтобы устранить основные, сделал первую модернизацию. Ее было необходимо сделать для увеличения скорости печати, иначе печатать на данном принтере можно только на очень низкой скорости 30-40 мм/сек. А сегодня буду проводить вторую модернизацию. Данная модернизация нужна в основном для комфортной работы.

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

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

В связи с тем, что у меня сломался кулер обдува хотенда

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

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

Дальше приступил к устранению еще одной досадной ситуации.

Термодатчик крепиться только с помощью клейкой ленты

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

Пока однажды термодатчик не выпал из отверстия, где он стоял.

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

Для того, чтобы наклеить термоизоляционную наклейку необходимо снять стол.

Для того, чтобы наклеить термоизоляционную наклейку необходимо снять стол.

Чтобы наклейка не мешала винтам с пружинками, которые держат стол, подрезал уголки на наклейке

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

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

И напоследок, установил силиконовый чехол на хотенд.

И напоследок, установил силиконовый чехол на хотенд.


Данная модернизация 3D принтер Anet A8 ускорит нагрев стола и хотенда, а при печати ABS и PETG пластиком это занимает достаточно долгое время. Также уменьшит рассеивание тепла, что снизит расход электроэнергии. Ещё снизит вероятность отклеивания от стола детали при печати ABS пластиком.

После модернизации и калибровки решил проверить печать. Мне нужно было напечатать пару крупных деталей соплом 0,6 мм. Вот результат.

После модернизации и калибровки решил проверить печать. Мне нужно было напечатать пару крупных деталей соплом 0,6 мм.

А так, Anet A8 сам по себе работает достаточно шумно.


Вывод следующий: нагрев стола стал быстрее; работает тише, но это благодаря замене сломанного кулера. А так, Anet A8 сам по себе работает достаточно шумно.

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

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Ночник с сенсорной кнопкой из Киндер Сюрприз - diy. http://portal-pk.ru/news/259-nochnik-s-sensornoi-knopkoi-iz-kinder-syurpriz---diy.html Константин Portal-PK 2020-04-30T12:00:21+03:00 Пару лет назад я делал ночник из Kinder Sorpresa. Не смотря на свою простоту исполнения и небольшой размер, данный ночник светит ярко и пользуется популярностью. Один знакомый, увидев ночник, заинтересовался и подсказал очень интересное решение: «Вот бы еще сделать сенсорное включение, чтобы пошел у меня ребенок ночью в туалет, бац рукой по нему и ночник включился. Пошел обратно, бац рукой и свет выключился. И при этом чтобы не было сильно ярко». Приступил я к реализации, что у меня получилось, смотрите ниже.

Для данного DIY понадобится:

Для данного DIY понадобится

Как видим для ночника из Киндер Сюрприза нужно немного элементов. И практически все доступные. Только нужно купить сенсорную кнопку, но стоит она недорого.


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

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

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

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

Подключал к зарядному устройству и к внешнему Power Bank, все работает как нужно.


Этапы сборки сенсорного ночника из Киндер Сюрприза.

Приступим к сборке.

Сперва нам нужно подготовить USB провод. Отрезаем провод, оставив небольшой кусок длиной 10 см.

Сперва нам нужно подготовить USB провод. Отрезаем провод, оставив небольшой кусок длиной 10 см. и зачищаем его. Дальше нужно определить какие провода подают питание 5в. Чаше всего это провода красного и черного цвета, у меня коричневый и черный. Если у вас есть мультиметр, можно прозвонить и найти нужный провод.

В USB разъёме это самые длинные контакты и располагаются они по кроям.

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

В нижней части капсулы из Kinder Sorpresa сделал отверстие и установил в него подготовленный USB разъем.

В нижней части капсулы из Kinder Sorpresa сделал отверстие и установил в него подготовленный USB разъем.

Дальше нам понадобится паяльник. ВНИМАНИЕ! Детям нельзя пользоваться паяльником без присмотра взрослых.

Спаиваем все элементы по схеме, которая представлена выше.

Спаиваем все элементы по схеме, которая представлена выше.

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

Затем на двухсторонний скотч приклеиваем светодиоды, предварительно отогнув их так чтобы, они светили в центр капсулы из-под Kinder Sorpresa

Затем на двухсторонний скотч приклеиваем светодиоды, предварительно отогнув их так чтобы, они светили в центр капсулы из-под Kinder Sorpresa. На крышку приклеиваем сенсорную кнопку. Но тут будьте внимательны, скотч клеим по краям кнопки, ни в коем случае не клейте скотч в центр кнопки. Так как сенсорный элемент не должен соприкасаться с поверхностью, иначе он будет срабатывать произвольно.

Закрываем капсулу и наш ночник готов. Сейчас можно проверить, как работает наше изобретение.

Закрываем капсулу и наш ночник готов. Сейчас можно проверить, как работает наше изобретение.


Проверка и тестирование diy из Kinder Sorpresa.

Для проверки работоспособности ночника достаточно его подключить к источнику 5в. Это может быть зарядное устройство от телефона или Power Bank.

Проверка и тестирование diy из Kinder Sorpresa.

Для тестирования я использовал недорогой Power Bank. Все работает отлично. И в связи с тем, что источник питания автономный данный ночник можно поставить где угодно. А при необходимости приклеить или закрепить в нужном месте, например, на кухне. Если вдруг к вам придёт «Ночная жрица», чтобы ни кого не разбудить!


Подведём итог.

Ночник делается из простых и достаточно дешевых элементов. А универсальность изделия позволяет пользоваться данным ночником не только дома, но и в походе, и на даче. Отличная самоделка и повторить ее достаточно просто.

Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Автоматический дозатор мыла и антисептика своими руками. http://portal-pk.ru/news/258-avtomaticheskii-dozator-myla-i-antiseptika-svoimi.html Константин Portal-PK 2020-04-21T12:27:30+03:00 В школе робототехники, где я работаю преподавателем, попросили сделать автоматический дозатор мыла на Arduino. Начал я разрабатывать данный проект и тут закрыли всех на карантин. Проект автоматического сенсорного дозатора для жидкого мыла так и стоял недоделанным. Решил я исправить данную ситуацию и вот что получилось.

Проект автоматического сенсорного дозатора для жидкого мыла так и стоял недоделанным.

Дозатор работает от батарейки крона 9v, что обеспечивает автономность и безопасность работы, но есть и минусы. Но обо всем по порядку.

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

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

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

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


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

Для программирования и отладки сенсорного дозатора мыла собираем все элементы на макетной плате по схеме.

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

При сборке схемы для автономной работы от батарейки крона изменим схему подключения. Плюсовой контакт Servo подключим в пину vin, так как данный пин соединен напрямую с источником питания, в нашем случае это батарейка крона 9v. Соответственно питание на Servo будет 9 в.

Плюсовой контакт Servo подключим в пину vin, так как данный пин соединен напрямую с источником питания,


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

В связи с тем, что инфракрасный модуль препятствия устроен так, что при появлении препятствия на выходе датчика будет 5 в. При отсутствии препятствия соответственно 0. Поэтому код будет аналогичен работе изменения положения сервопривода при нажатии кнопки. Урок можно посмотреть тут: Подключает servo-привод к arduino. Сервопривод + кнопка

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


Сборка самодельного дозатора.

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

Сперва устанавливаем сервопривод

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

Затем приклеил на двухсторонний скотч остальные элементы: Ардуино, датчик и батарею крона.

Затем приклеил на двухсторонний скотч остальные элементы: Ардуино, датчик и батарею крона.

С помощью соединительных проводов соединил все элементы как показано на схеме выше.

С помощью соединительных проводов соединил все элементы как показано на схеме выше.

Закрепил под крышкой одну сторону нитки, перекинул через носик дозатора, а второй край прикрепил к рычажку сервопривода.

Закрепил под крышкой одну сторону нитки, перекинул через носик дозатора, а второй край прикрепил к рычажку сервопривода.


Обзор автоматического сенсорного дозатора для жидкого мыла.

Обзор автоматического сенсорного дозатора для жидкого мыла.

Самодельный автоматический дозатор жидкого мыла на Arduino готов. Когда подносим руки к дозатору, то срабатывает сервопривод и на руки подаётся жидкое мыло. Все работает, причем автономно. Бутылку с мылом можно поставить в любое место. Или сделать бутылку с антисептиком и поставить в коридоре около входной двери, что позволит при возвращении с улицы ни чего не прикасаясь обработать руки. Достаточно удобная и необходимая самоделка в нынешней ситуации.

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

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


Вывод можно сделать следующий.

Дозатор работает, и пользоваться можно, но желательно поставить более мощный сервопривод. А также рассмотреть реализацию с напечатанными на 3D принтере элементами, для более надежной фиксации электронных компонентов.


Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Что такое Arduino? http://portal-pk.ru/news/257-chto-takoe-arduino.html Константин Portal-PK 2020-04-17T13:12:41+03:00 Программная часть состоит из бесплатной программной оболочки (Arduino IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Arduino.

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

Больше информации читайте на сайте разработчика и в Википедии. А сейчас на простом примере рассмотрим, как Arduino можно использовать в робототехнике и при разработке самодельных ЧПУ станков и 3D принтеров.

Arduino — это огромный конструктор, в котором нет ограничений в разнообразии того, что можно собрать. Всё ограничено лишь вашей фантазией и возможностью электроники.

Arduino — это огромный конструктор,

Arduino представляет собой небольшую плату с собственным процессором и памятью. На ней также есть пара десятков контактов, к которым можно подключать всевозможные компоненты: светодиоды, датчики, моторы, модули, магнитные дверные замки и вообще всё, что работает от электричества.

Arduino представляет собой небольшую плату с собственным процессором и памятью

В процессор Arduino можно загрузить программу, которая будет управлять всеми этими устройствами по заданному алгоритму. Таким образом, можно создать бесчисленное количество оригинальных устройств, сделанных своими руками и по собственной задумке. Для того, чтобы понять идею, взгляните на иллюстрацию. Она не отражает и миллионной доли всех возможностей, но всё же даёт первичное представление:

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


В чем преимущество Arduino?

Пользователь современного компьютера не задумывается о функционировании отдельных частей ПК. Он просто запускает нужные программы и работает с ними. Точно так же и Arduino позволяет пользователю сосредоточиться на разработке проектов, а не на изучении устройства и принципов функционирования отдельных элементов. Нет надобности и в создании законченных плат и модулей. Разработчик может использовать готовые платы расширения или просто напрямую подключить к Arduino необходимые элементы. Все остальные усилия будут направлены на разработку и отладку управляющей программы на языке высокого уровня. В итоге доступ к разработке микропроцессорных устройств получили не только профессионалы, но и просто любители что-то сделать своими руками. Наличие готовых модулей и библиотек программ позволяет непрофессионалам в электронике создавать готовые работающие устройства для решения своих задач. А варианты использования Arduino ограничены только возможностями микроконтроллера и имеющегося варианта платы, ну и, конечно, фантазией разработчика.

В чем преимущество Arduino?

Сложно ли начать изучение?

Свою огромную популярность Arduino приобрела именно благодаря простоте и дружелюбности. Даже абсолютный ноль в программировании и робототехнике может освоить основы работы с Arduino за пару дней! Этому способствуют тысячи публикаций, учебников, заметок в интернете и куча роликов на YouTube.

Программы для Arduino пишутся на обычном C++, дополненным простыми и понятными функциями для управления вводом/выводом на контактах. Если вы уже знаете C++ — Arduino станет дверью в новый мир, где программы не ограничены рамками компьютера, а взаимодействуют с окружающим миром и влияют на него. Если же вы новичок в программировании — не проблема, вы с лёгкостью научитесь, это просто.

Для удобства работы с Arduino существует бесплатная официальная среда программирования «Arduino IDE», работающая под Windows, Mac OS и Linux. С помощью неё загрузка новой программы в Arduino становится делом одного клика, только лишь подключите плату к компьютеру через USB.

Arduino IDE

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

В следующих статьях рассмотрим, что такое Arduino IDE. Сравним платы Arduino и определим, с какой платы лучше начинать изучать Arduino и прочее.


Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новой статье.

]]>
Самодельные часы - плеер на Arduino с сенсорным дисплеем Nextion. http://portal-pk.ru/news/256-samodelnye-chasy---pleer-na-arduino-s-sensornym-displeem.html Константин Portal-PK 2020-04-13T15:24:34+03:00 Разработка часов на Arduino достаточно увлекательная и интересная тема. На моём сайте вы найдете большое количество различных проектов часов, в том числе и проект часов на Arduino с дисплеем Nextion.

В данном проекте будем дорабатывать часы на Arduino с сенсорным дисплеем Nextion. Напечатаем новый корпус на 3D принтере и добавим возможность воспроизведения MP3 файлов с карты памяти.

В данном проекте будем дорабатывать часы на Arduino с сенсорным дисплеем Nextion. Напечатаем новый корпус на 3D принтере

Первая версия часов с сенсорным дисплеем.

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

Для того, чтобы собрать часы на Arduino с дисплеем Nextion нам понадобится:

1. Arduino Nano V3.0 (ATmega328). Версия Arduino Nano V2.0 (ATmega168) не подойдет, так как для текущего функционала недостаточно памяти.

2. Дисплей Nextion 2,8 дюйма. Можно и другого размера.

3. Датчик температуры и влажности SHT3x (SHT31) .

4. Часы реального времени (RTC) DS3231, я использовал версию mini.

5. Разъем 5.5 мм, для подключения питания часов.

6. MP3-плеер DFPlayer Mini.

7. Динамик 3Вт. 4Ом.

8. Провода для соединения элементов.

9. Пластик для печати корпуса.

10. Винты, гайки и шайбы М3.

11. Краска для покраски корпуса. Можно и не красить.

Эти комплектующие пригодятся при сборе часов с сенсорным дисплеем

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


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

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

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

Перед тем, как установить все в корпус, необходимо запрограммировать Arduino. Это связано с тем, что мы будем использовать аппаратные пины RX TX. На плате это pin 0 и 1. Если мы подключим к ним дисплей, то прошить Ардуино не получится, будет выводить ошибку. Вот почему так важно перед сборкой загрузить скетч в Arduino NANO.


Скетч часов на Arduino с дисплеем Nextion.

Скетч часов на Arduino с дисплеем Nextion можно скачать внизу статьи, в разделе материалы для скачивания. Там же вы найдете все необходимые библиотеки.

Скетч часов на Arduino с дисплеем Nextion можно скачать внизу статьи, в разделе материалы для скачивания. Там же вы найдете все необходимые библиотеки.

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

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


Корпус для часов Nextion.

После того, как забраковали мой первый корпус для часов, я решил не расстраиваться, а сделать 3D Model в программе Fusion 360.

3D Model в программе Fusion 360

Модель, к сожалению, утеряна, так как у меня сломался жёсткий диск. Остался только код для печати на 3D принтере пластиком PLA, соплом 0,4 мм.Код можно скачать в разделе материалы для скачивания.

Корпус удался не с первого раза.

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

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

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

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

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

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


Сборка часов с сенсорным дисплеем.

Сборка часов с сенсорным дисплеем.

После того, как Arduino запрограммирована, можно приступить к установке электроники в корпус. Поэтапно устанавливаем все элементы: датчик температуры и влажности, модуль MP3 плеера, динамик, его устанавливаю на заднюю крышку с помощью крепежного кольца.

крышку с помощью крепежного кольца.

Дисплей Nextion закрепляю с помощью винтов M3, предварительно подложив по три шайбы между корпусом и дисплеем. Это необходимо для того, чтобы корпус и дисплей были на одном уровне. Устанавливаем разъём питания на заднюю крышку. После чего зданию крышку устанавливаем на место, и закрепляем ее с помощью двух винтов.

Часы готовы и теперь их можно проверить.

Часы готовы и теперь их можно проверить.


Обзор готовых часов плеера на Ардуино с дисплеем.

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

Функции и возможности самодельных часов на Ардуино

Функции и возможности самодельных часов на Ардуино:

  • Вывод даты и времени;
  • Вывод температуры и влажности;
  • Настройка даты и времени;
  • Время не сбрасывается при отключении питания;
  • Воспроизведение музыки с карты памяти;
  • Настраиваемые плейлисты.
  • Воспроизведение композиций из выбранного плейлиста.
  • Воспроизведение случайной композиции.
  • Настройка громкости.

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

Вывод.

Возможности Arduino NANO достаточно обширные и реализовать на данной отладочной плате можно различные самоделки. Я планировал добавить еще пару функций, но памяти уже не достаточно и ардуинка начинает подвисать, если посылать большое количество команд с дисплея. Поэтому следующая версия часов с дисплеем Nextion будет на ESP32.

Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Arduino урок 24. Анимация на семисегментный индикатор TM1637. http://portal-pk.ru/news/255-animaciya-na-semisegmentnyi-indikator-tm1637.html Константин Portal-PK 2020-04-02T15:14:46+03:00 Сегодня в Arduino уроке научимся выводить анимацию и бегущую строку на семисегментный индикатор TM1637. Если вы не знаете, что такое семисегментный индикатор TM1637, или у вас возникли сложности с данным уроком, вы можете посмотреть предыдущий урок:Урок 23. Подключение сегментного дисплея TM1637 к Arduino. В нём уже рассматривали модуль TM1637, с простыми примерами использования данного модуля.

Сегодня в Arduino уроке научимся выводить анимацию и бегущую строку на семисегментный индикатор TM1637

Установка и настройка библиотеки TM1637.h.

Для данного урока будем использовать другую библиотеку, которая обладает рядом преимуществ:

  • Вывод символов происходит простым написанием этого символа в коде;
  • Есть готовая функция скроллинга текста, просто указываем массив символов. Таким способом удобно выводить дату и год;
  • Функции анимации вывода символов на дисплей;

Скачать библиотеку можно внизу статьи, в разделе "Материалы для скачивания". После того, как вы скачали архив с библиотекой, её нужно установить. Для этого откроем Arduino IDE, перейдем в раздел Скетч -> Подключить библиотеку -> Добавить ZIP. библиотеку.

Установка и настройка библиотеки TM1637.h.

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

После установки, библиотека появиться в списке библиотек.

Внимание! Если вы ставили другие библиотеки для работы с дисплеем TM1637, их необходимо удалить. В противном случае возможен конфликт. Удалить библиотеку можно из менеджера библиотек, конечно если вы ставили через менеджер библиотек. Или напрямую из папки libraries, которая располагается: C:\Users\(Пользователь)\Documents\Arduino\libraries в операционной системе Windows.

 Если вы ставили другие библиотеки для работы с дисплеем TM1637, их необходимо удалить.

Описание функций библиотеки TM1637

init() - инициализация
set(n) - яркость сегментов от 0 до 7
clearDisplay() - очистить экран
point(True) - выключить/включить разделитель (две вертикальные точки)
displayInt(value) - вывести на экран четырёхзначное число
displayIntZero(value) - вывести на экран четырёхзначное число с нулями слева
display(posit, Byte) - вывести на экран символ Byte (0-9) в одну из четырёх позиций posit(0-3)
display(array) - вывести на экран массив array из четырёх символов
displayByte(posit, Byte) - вывести на экран символ Byte в одну из четырёх позиций posit(0-3)
displayByte(ARRAY_BYTE) - RRAY_BYTE - массив ( 0x7d, 0x7d, 0x7d, 0x7d )
displayByte(Byte1, Byte2, Byte3, Byte4) - вывести на экран четыре знака
runningString(buf, sizeof(buf), delay) - бегущая строка из массива (массив, размер массива, задержка в мс)
scroll(BitAddr, DispData, delayms) - обновить значение пролистыванием (адрес, символ, задержка в мс)
scroll(DispData[], delayms) - обновить значение пролистыванием (массив символов, задержка в мс)
scrollByte(BitAddr, DispData, delayms) - обновить значение пролистыванием (адрес, БАЙТ, задержка в мс)
scrollByte(DispData[], delayms) - обновить значение пролистыванием (массив, задержка в мс)
twist(BitAddr, DispData, delayms) - обновить значение вращением (адрес, символ, задержка в мс)
twist(DispData[], delayms) - обновить значение вращением (массив символов, задержка в мс)
twistByte(BitAddr, DispData, delayms) - обновить значение вращением (адрес, БАЙТ, задержка в мс)
twistByte(DispData[], delayms) - обновить значение вращением (массив, задержка в мс)
displayClock(hrs, mins) - выводит часы, минуты
displayClockScroll(hrs, mins, delayms) - выводит часы, минуты с эффектом пролистывания экрана вниз
displayClockTwist(hrs, mins, delayms) - выводит часы, минуты с эффектом вращения знакоместа

Сейчас можно приступить к подключению сегментного дисплея TM1637 к Arduino.

Подключение дисплея TM1637 к Arduino

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

  • Arduino Nano [PIN 5V] - TM1637 Module[PIN 5V]
  • Arduino Nano [PIN GND] - TM1637 Module[PIN GND]
  • Arduino Nano [PIN 2] - TM1637 Module[PIN DIO]
  • Arduino Nano [PIN 3] - TM1637 Module[PIN CLK]

Подключить TM1637 к Arduino UNO можно по аналогичной схеме.

Подключить TM1637 к Arduino UNO можно по аналогичной схеме.

Пример кода для вывода анимации и бегущей строки на семисегментный индикатор с драйвером TM1637.

Пример 1. Анимация пузыри на TM1637.

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

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  running_text(); // пузыри
}
void running_text() // пузыри
{
  byte buf[] = {_degree, _o, _degree, _o, _degree, _o, _degree, _o, _degree, _o, _degree, _o};
  disp.runningString(buf, sizeof(buf), 300);  // время в мс
}

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

Пример 2. Вывод символов со скроллингом текста вниз.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
static byte buff[4] = {_L, _E, _G, _O};
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  scrolling_text();// скролинг текста вниз
}
void scrolling_text() // скролинг текста вниз
{
  disp.clear();
  disp.scrollByte(buff, 100);
  delay(1000);
}

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

Пример 3. Анимация вращения символов на дисплее TM1637.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
static byte buff[4] = {_S, _t, _O, _P};
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  rotation_all_sign(); // вращение по часовой стрелке всех символов
  rotation_one_sign(); // вращение символов по очереди слева на право
}
void rotation_all_sign()  // вращение по часовой стрелке всех символов
{
  disp.clear();
  disp.twistByte(buff, 100);
  delay(1000);
}
void rotation_one_sign()  // вращение символов по очереди слева на право
{
  for (uint8_t i = 0; i < 4; i++)
  {
    disp.twistByte(i, buff[i], 70);
    delay(100);
  }
}

Информация на дисплее появляется с эффектом вращения символов. Первая функция вращает все символы и выводит их на дисплей. Вторая функция вращает по одному символу и выводит их на дисплей по очереди.

Пример 4. Обычные часы и изменения яркости.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  normClock(); //обычные часы
  blinking_text(); //изменяем яркость
}
void normClock() //обычные часы
{
  byte hrs = 19, mins = 55;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   //выкл/выкл разделитель:
     if (flag) 
      {
        // ***** часы! ****
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
      // ***** выводим часы! ****
      disp.displayClock(hrs, mins);   // выводим время функцией часов
      }
    }
  }
  disp.point(0);   // выкл точки
}
void blinking_text() //изменяем яркость
{
   disp.brightness(0);
   delay(500);
    for (uint8_t i = 0; i < 5; i++) 
    {
      disp.brightness(2);
      delay(200);
      disp.brightness(7);
      delay(200);
      disp.brightness(0);
      delay(500);
    }
 disp.brightness(7);
}

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

Пример 5. Часы с вращающимися символами на TM1637 и Arduino.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  twistClock(); //часы с вращающимися цифрам
}
void twistClock()  //часы с вращающимися цифрам
{
  byte hrs = 19, mins = 53;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл точки
      if (flag) 
      {
        // ***** часы! ****
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** часы! ****
        disp.displayClockTwist(hrs, mins, 35);    // показываем часы
      }
    }
  }
  disp.point(0);   // выключить разделитель :
}

В данном примере сделаем имитацию работы часов с выводом символов с анимацией вращения. Пример подойдёт для реализации часов с красивым выводом значений даты и времени на TM1637 и Arduino.

Пример 6. Часы со скроллингом текста сверху вниз на TM1637 и Arduino.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  scrollClock(); //часы со скролингом цифр
}
void scrollClock() //часы со скролингом цифр
{
  byte hrs = 19, mins = 54;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл разделитель:
      if (flag) 
      {
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** выводим часы! ****
        disp.displayClockScroll(hrs, mins, 70);    // показываем часы
      }
    }
  }
  disp.point(0);   // выкл точки
}

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

Пример 7. Бегущая строка на TM1637 и Arduino.

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

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  running_text();
}
void running_text()
{
  byte buf[] = { _A,_r,_d,_u,_i,_n,_o,0,0,_N,_A,0,0,_P,_o,_r,_t,_A,_L,0,_P,_C,0,0,_A,_r,_d,_u,_i,_n,_o,0,0,_S,_E,_N,_S,_O,_r,_S,0,0,_A,_L,_L,0,0,_F,_o,_r,0,0,\
  _A,_r,_d,_u,_i,_n,_o,0,0,_b,_o,_A,_r,_d,_S,0,0};
  disp.runningString(buf, sizeof(buf), 200);  // время в мс
}

Для примера вывел надпись: _A,_r,_d,_u,_i,_n,_o,0,0,_N,_A,0,0,_P,_o,_r,_t,_A,_L,0,_P,_C,

Как вы догадываетесь это: Arduino na Portal PC. Почему PC? Дисплей не поддерживает символ К.

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

Планирую сделать часы на TM1637 и Arduino с использованием анимации.

Планирую сделать часы на TM1637 и Arduino с использованием анимации.

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Проекты ночников и светильников на Arduino. http://portal-pk.ru/news/254-proekty-nochnikov-i-svetilnikov-na-arduino.html Константин Portal-PK 2020-03-31T15:38:35+03:00

Собрал все свои светильники и ночники, которые я делал на Ардуино. Данный список будет пополняться по мере созданий новых проектов в данной теме. Сюда не попадают проекты, которые еще не доделанные.

6. Космический ночник со стеклянными шарами своими руками.

Сегодня расскажу про светильник, который сделал своими руками на Arduino (DigiSpark).Очень красивый светильник со стеклянными шарами. Знакомые сказали, что его можно использовать вместо свечек для создания романтичной обстановки. И я с ними согласен. Светильник достаточно яркий и красивый. Стеклянные шары выглядят просто сногсшибательно. Пузырьки воздуха внутри шарика похоже на звезды в небе. А переливающий свет придает дополнительный антураж.

Ночник со стеклянными шарами на Arduino своими руками.

5. Сенсорный светильник с большой площадью срабатывания на Arduino (Digispark).

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

Управляет всем небольшой микроконтроллер Arduino (Digispark). Для обеспечения 5 режимов работы использовал светодиодную ленту ws2812b.

Cамодельный сенсорный светильник на Arduino (Digispark).

4. Ночник в виде куба с несколькими режимами работы на Arduino и светодиодах WS2812.

Ночник в виде куба с несколькими режимами работы на Arduino и светодиодах WS2812.При изучении 3D моделирования, и осваивая печать на 3D принтере, сделал вот такой ночник в виде куба. Не смотря на свою простоту и небольшой размер данный ночник нравится многим знакомым. Управляет ночником Ардино (DigiSpark) в качестве светодиодов отлично подошли светодиоды ws2812b.

Светодиодный ночник в виде куба.

3. Два варианта ночника «светофор» на Arduino иадресных светодиодах WS2812.

Два варианта ночника «светофор» на Arduino иадресных светодиодах WS2812.

Сделал уже два варианта светофора на Arduino и адресных светодиодах WS2812. Достаточно удобные ночники и нравиться детям. У меня ребенок играл месяца 2 с данным светильником. Также использовал как ночник. В связи с тем, что он работает на батарейках, его можно поставить в любое место. Ребенок включает его и ставит на тумбочку около кровати. Время работы от 7 до 9 ночей.

Ардуино светофор на digispark и ws2812b

Светофор на Digispark и адресных светодиодах WS2812 — Ардуино светофор

2. Светильник, сделанный на ЧПУ станке с 5 режимами работы и регулировкой яркости.

Светильник, сделанный на ЧПУ станке с 5 режимами работы и регулировкой яркости.

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

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

Очередной проект на Digispark и адресных светодиодах WS2812. Работа ЧПУ

1. Ночник из банки из-под витаминов на Arduino и адресных светодиодах WS2812.

Ночник из банки из-под витаминов на Arduino и адресных светодиодах WS2812.

Это первый проект, который я сделал на адресных светодиодов WS2812. Рассеиватель сделал из банки из-под витаминов для детей.

Через некоторое время переделал данный светильник, добавил режимы работы и вместо Arduino NANO установил Digispark.

Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

Умный ночник на Arduino и адресных светодиодах WS2811

]]>
Урок 23. Подключение сегментного дисплея TM1637 к Arduino. http://portal-pk.ru/news/253-podklyuchenie-segmentnogo-displeya-tm1637-k-arduino.html Константин Portal-PK 2020-03-24T12:24:49+03:00 Сегодня в уроке подключим семисегментный индикатор TM1637 к Arduino. Установим библиотеку TM1637.h и научимся выводить на дисплей цифры и некоторые символы.

Как устроен и из чего состоит модуль TM1637.

Характеристики Индикатора на TM1637:
• Напряжение питание: 5,5В
• Потребляемый ток 0.2 — 80мА (в зависимости от горящих сегментов)
• Градаций яркости индикаторов — 8
• Размеры платы: 42x24мм
• Двух проводной последовательный интерфейс (CLK, DIO).

Фото модуля от магазина RobotDyn фронтальный вид.

Фото модуля от магазина RobotDyn, фронтальный вид

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Этот модуль собран на драйвере TM1637.
• Есть модули красного, синего, зелёного, белого цвета.
• Размеры 0,36” и 0,56”

В уроке будем использовать модуль TM1637 0,56”, зеленого цвета.


Возможности модуля TM1637:
• Зажигать сразу все знаки или по одному сегменту или символу,
• Выводить цифры от 0 до 9 и некоторые буквы. Смотри ниже.
• Цифры могут выводиться как с нулями слева, так и без них,
• 8 градаций изменения яркости.
• Вывод символа в определённую позицию (ячейку).

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Подключение дисплея TM1637 к Arduino

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

Подключение дисплея TM1637 к Arduino

Arduino Nano [PIN 5V] - TM1637 Module[PIN 5V]

Arduino Nano [PIN GND] - TM1637 Module[PIN GND]

Arduino Nano [PIN 2] - TM1637 Module[PIN DIO]

Arduino Nano [PIN 3] - TM1637 Module[PIN CLK]

Подключение дисплея TM1637 к Arduino UNO

Установка и настройка библиотеки TM1637.h.

Установить библиотеку TM1637.h можно из менеджера библиотек. Для этого откроем Arduino IDE, перейдем в раздел Скетч-> Подключить библиотеку -> Управление библиотеками.

Установить библиотеку TM1637.h

Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

 Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

Вы также можете скачать библиотеку TM1637 внизу урока, в разделе «материалы для скачивания».


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

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Для реализации простых проектов, таких как часы, индикаторы и счетчики, этого набора символов достаточно. Я реализовывал часы с выводом температуры и влажности: Arduino часы. Видео 2. Подключаем к Arduino TM1637 и датчик DHT11.

Для отображения температуры использовал символ «С» номер для вывода на индикатор 12и для отображения влажности использовал символ «F» номер для вывода на дисплей 15.

Но для некоторых проектов на Arduino не достаточно

Но для некоторых проектов на Arduino не достаточно данного набора символов. Расширить его достаточно легко, для этого в файле TM1637.cpp библиотеки находим массив TubeTab[] и добавляем нужные коды символов.

TM1637.cpp библиотеки

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

Если захочется закодировать свой символ, то можно использовать следующую таблицу:

После кодирования сегментов, установив нужные биты в байте,

После кодирования сегментов, установив нужные биты в байте, для сокращения записи можно перевести байт из двоичного в шестнадцатиричный формат, как - b00011110 -> 0x1E.


Пример кода для вывода информации на семисегментный индикатор с драйвером TM1637.

Пример 1. Вывод времени с мигающим двоеточием.

Пример 1. Вывод времени с мигающим двоеточием.

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

В данном примере выведем 4 цифры на индикатор TM1637,

Пример 2. Вывод слов на модуль TM1637.

Пример 2. Вывод слов на модуль TM1637.

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

Дополнительные символы добавили в библиотеку, сейчас осталось научиться их выводить.

Пример 3. Выводданных с датчиком с символами.

Пример 3. Выводданных с датчиком с символами.

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

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5) выводит первый символ на дисплей 5. Аналогично выводятся остальные 3 символа.

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5)

Для разделения числа на десятки и единицы, для нахождения единиц нужно найти остаток от деления на 10, и для получения десяток нужно число делить на 10.

Для разделения числа на десятки и единицы

И после числового значения выведем символ, например, для температуры символ «С».

И после числового значения выведем символ, например, для температуры символ «С».


Пример применим при выводе даты, времени и показаний с датчиков.


Появились вопросы или предложения не стесняйся, пиши в комментарии!

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Работа со встроенной EEPROM в микроконтроллерах на Arduino http://portal-pk.ru/news/252-rabota-so-vstroennoi-eeprom-v-mikrokontrollerah-na-arduino.html Константин Portal-PK 2020-03-21T10:19:57+03:00 Микроконтроллеры AVR, на основе которых создаются платы Arduino и Genuino, обладают встроенной EEPROM: памятью, которая хранит значения переменных, пока плата выключена (подобно крошечному жесткому диску). Описываемая в данной статье библиотека позволяет считывать и записывать данные в EEPROM.

Поддерживаемые микроконтроллеры на различных платах Arduino и Genuino обладают разным размером EEPROM: 1024 байта в ATmega328, 512 байт в ATmega168 и ATmega8, 4 KB (4096 байт) в ATmega1280 и ATmega2560. Платы Arduino и Genuino 101 обладают эмуляцией EEPROM пространства размером 1024 байт.

Функции для работы с EEPROM:

read()

Описание
Считывает байт из EEPROM. Ячейки, которые никогда не были записаны, содержат значение 255.
Синтаксис
EEPROM.read(address)
Параметры
address: адрес ячейки для считывания, начинается с 0 (int).
Возвращаемое значение
Значение, записанное в ячейку (byte).
Пример
/*
 * EEPROM Read
 *
 * Считывает значение каждого байта в EEPROM и выводит его
 * на компьютер.
 */

#include <EEPROM.h>

// начать чтение с первого байта (адрес 0) в EEPROM
int address = 0;
byte value;

void setup() {
  // инициализировать последовательный порт и ждать,
  // пока порт не будет открыт:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
}

void loop() {
  // прочитать байт из текущего адреса EEPROM
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++address &= EEPROM.length() - 1;
  ***/

  delay(500);
}

write()

Описание
Записывает байт в EEPROM.
Синтаксис
EEPROM.write(address, value)
Параметры
address: адрес ячейки для записи, начинается с 0 (int).
value: значение для записи, от 0 до 255 (byte).
Возвращаемое значение
Ничего не возвращается.
Примечание
Запись в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому, возможно, вам придется быть осторожными с тем, как часто записываете её.
Пример
/*
 * EEPROM Write
 *
 * Записывает значения, считанные с аналогового входа 0, в EEPROM.
 * Эти значения будут оставаться в EEPROM, когда плата будет
 * выключена, и могут быть извлечены позже при следующем запуске.
 */

#include <EEPROM.h>

/** текущий адрес в EEPROM (т.е. какой байт мы собираемся записать следующим) **/
int addr = 0;

void setup() {
  /** Нет никаких начальных настроек. **/
}

void loop() {
  /***
    Необходимо делить на 4, так как диапазон значений на аналоговых входах
    составляет от 0 до 1023, а каждый байт EEPROM может хранить значения
    только от 0 до 255.
  ***/

  int val = analogRead(0) / 4;

  /***
    Записать значение в соответствующий байт EEPROM.
    Эти значения останутся там, когда плата будет выключена.
  ***/

  EEPROM.write(addr, val);

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  addr = addr + 1;
  if (addr == EEPROM.length()) {
    addr = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++addr &= EEPROM.length() - 1;
  ***/
  delay(100);
}

update()

Описание
Записывает байт в EEPROM. Значение записывается, только если оно отличается от значения уже записанного по этому адресу.
Синтаксис
EEPROM.update(address, value)
Параметры
address: адрес ячейки для записи, начинается с 0 (int).
value: значение для записи, от 0 до 255 (byte).
Возвращаемое значение
Ничего не возвращается.
Примечание
Запись в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому данная функция, в отличие от write(), может сохранить время, если записываемые данные часто не меняются.
Пример
/***
   EEPROM Update

   Сохраняет значения, считанные с аналогового входа 0, в EEPROM.
   Эти значения будут оставаться в EEPROM, когда плата будет
   выключена, и могут быть извлечены позже при следующем запуске. 

   Если значение не изменилось, то EEPROM не перезаписывается,
   что поможет без необходимости не сокращать срок службы EEPROM.
 ***/

#include <EEPROM.h>

/** текущий адрес в EEPROM (т.е. какой байт мы собираемся записать следующим) **/
int address = 0;

void setup() {
  /** EMpty setup **/
}

void loop() {
  /***
    Необходимо делить на 4, так как диапазон значений на аналоговых входах
    составляет от 0 до 1023, а каждый байт EEPROM может хранить значения
    только от 0 до 255.
  ***/
  int val = analogRead(0) / 4;

  /***
    Обновить конкретную ячейку EEPROM.
    Эти значения останутся там при выключении платы.
  ***/
  EEPROM.update(address, val);

  /***
    Функция EEPROM.update(address, val) эквивалентна следующему:

    if( EEPROM.read(address) != val ){
      EEPROM.write(address, val);
    }
  ***/

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++addr &= EEPROM.length() - 1;
  ***/

  delay(100);
}

get()

Описание
Считывает любой тип данных или объект из EEPROM.
Синтаксис
EEPROM.get(address, data)
Параметры
address: адрес для чтения, начинается с 0 (int).
data: данные для чтения, могут быть примитивным типом (например, float) или пользовательской структурой struct.
Возвращаемое значение
Ссылка на переданные данные.
Пример
/***
    Чтобы предварительно записать данные в EEPROM, используйте 
    пример для функции put().
    Можно обойтись и без этого, но значения, выводимые этим скетчем,
    зависят от того, что содержится в EEPROM. Это может заставить
    объект последовательного порта вывести на печать длинную строку
    мусора, если в загруженной строке не будет найден нулевой символ.
***/

#include <EEPROM.h>

void setup() {

  float f = 0.00f;   // Переменная для хранения данных, прочитанных из EEPROM.
  int eeAddress = 0; // Адрес EEPROM, откуда следует начать чтение.

  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.print("Read float from EEPROM: ");

  // Получить данные типа float из EEPROM в месте 'eeAddress'
  EEPROM.get(eeAddress, f);
  Serial.println(f, 3);    // Это может напечатать 'ovf, nan', если данные в EEPROM 
                           // не корректны для float.

  /***
    Так как get возвращает ссылку на 'f', вы можете использовать ее в качестве аргумента
    То есть: Serial.print( EEPROM.get( eeAddress, f ) );
  ***/

  /***
    Get может использоваться и с пользовательскими структурами.
    Пример с ними выделен в отдельную функцию.
  ***/

  secondTest(); // Запустить следующий тест.
}

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

void secondTest() {
  int eeAddress = sizeof(float); // Переместить адрес к байту, следующему после float 'f'.

  MyObject customVar; // Переменная для хранения данных, прочитанных из EEPROM.
  EEPROM.get(eeAddress, customVar);

  Serial.println("Read custom object from EEPROM: ");
  Serial.println(customVar.field1);
  Serial.println(customVar.field2);
  Serial.println(customVar.name);
}

void loop() {
  /* Пустой цикл */
}

put()

Описание
Записывает любой тип данных или объект из EEPROM.
Синтаксис
EEPROM.put(address, data)
Параметры
address: адрес для записи, начинается с 0 (int).
data: данные для записи, могут быть примитивным типом (например, float) или пользовательской структурой struct.
Возвращаемое значение
Ссылка на переданные данные.
Примечание
Функция использует EEPROM.update() для реализации записи, поэтому она не перезаписывает значение, если оно не изменилось.
Пример
/***
    Этот скетч также можно использовать для предварительной
    записи в EEPROM данных, используемых в примере для функции get().

    Обратите внимание, что, в отличие от однобайтной версии EEPROM.write(),
    функция put использует обновление. То есть байт будет записан, только
    если он отличается от записанных в EEPROM данных. 
***/

#include <EEPROM.h>

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }

  float f = 123.456f;  // Переменная для записи в EEPROM.
  int eeAddress = 0;   // Место, куда мы хотим положить данные.
  // Простой вызов с адресом и переменной в качестве аргументов.
  EEPROM.put(eeAddress, f);

  Serial.println("Written float data type!");

  /** Put поддерживает и пользовательские структуры. **/

  //Data to store.
  MyObject customVar = {
    3.14f,
    65,
    "Working!"
  };

  eeAddress += sizeof(float); // Переместить адрес к байту, следующему после float 'f'.

  EEPROM.put(eeAddress, customVar);
  Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!");
}

void loop() {
  /* Пустой цикл */
}

EEPROM[]

Описание
Данный оператор позволяет использовать идентификатор 'EEPROM', как массив. Ячейки EEPROM могут быть прочитаны и записаны непосредственно с помощью этого оператора.
Синтаксис
EEPROM[address]
Параметры
address: адрес для чтения/записи, начинается с 0 (int).
Возвращаемое значение
Ссылка на ячейку EEPROM.
Пример
#include <EEPROM.h>

void setup(){

  unsigned char val;

  // Прочитать первую ячейку EEPROM.
  val = EEPROM[ 0 ];

  // Записать первую ячейку EEPROM.
  EEPROM[ 0 ] = val;

  // Сравнить содержимое
  if( val == EEPROM[ 0 ] ){
    // Сделать что-то...
  }
}

void loop(){ /* Пустой цикл */ }
]]>
#22. Подключаем к Arduino джойстик. Управление servo сервоприводом. http://portal-pk.ru/news/251-podklyuchaem-k-arduino-dzhoistik-upravlenie-servo.html Константин Portal-PK 2020-03-18T14:15:57+03:00 Сегодня в уроке подключим джойстик к Arduino UNO. И рассмотрим пару примеров использования джойстика в робототехнике:

  1. Вывод данных о положении стика джойстика в монитор порта.
  2. Управление свечением двух светодиодов с помощью джойстика.
  3. Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

А для начала рассмотрим, что такое джойстик, из чего он состоит и как устроен.

Устройство аналогово джойстика и принцип работы.

Устройство аналогово джойстика и принцип работы.

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

Устройство аналогово джойстика и принцип работы.

Управляет всем стик. При изменении положения стика по оси X - вращается потенциометр, выход которого outX, а при перемещении по оси Y - меняется значение потенциометра с выводом outY. По сути, это 2 потенциометра, с которых снимаем показания. Стик устроен таким образом, что он возвращается самостоятельно в центральное положение. Что обеспечивает центрование потенциометров. В данном состоянии джойстика на выходах outX, outY будет 511.

Управляет всем стик. При изменении положения стика по оси X

Но на практике это значение может быть другим, оно зависит от точности сборки, качества потенциометров и прочих факторов. Подробнее данную ситуацию рассмотрим на примере.

На плате установлена тактовая кнопка. Использовать ее или нет решать вам. При создании пульта для радиоуправляемой машинки я использовал данную кнопку для переключения режима работы: с джойстика или с акселерометра. Если интересно читайте на странице проекта: Машинка на радиоуправлении. Arduino + nrf24l01 + пульт.


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

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

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

подключим джойстик к Arduino UNO по схеме.

После чего нужно загрузить код в Arduino UNO.

После чего нужно загрузить код в Arduino UNO.

В мониторе порта будут вот такие данные.

В мониторе порта будут вот такие данные.

Как видите, они отличаются от 511. Показание отличаются на разных осях X=507, Y=510. Эти данные нам пригодятся в следующем примере.

Если мы подвигаем стик джойстика, то увидим изменение значений от 0 до 1023 по каждой оси.

Если мы подвигаем стик джойстика, то увидим изменение значений от 0 до 1023 по каждой оси.

На выходе мы получаем значение до 1023. Данный диапазон значений практически не применим в проектах на Ардуино, поэтому давайте приведем это значение к диапазону от 0 до 255, для этого воспользуемся функцией map().

 Данный диапазон значений практически не применим в проектах на Ардуино

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

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


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

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

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

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

Так как мы знаем значение при центральном положении стика, для оси Х это 507, а для оси Y 510, используя функцию map(), приведем к необходимому диапазону, например для оси Х от 507 до 1023 к диапазону от 0 до 255. Код будет вот таким.

Так как мы знаем значение при центральном положении стика

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


Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

Джойстик часто используется для управления сервоприводами. Поэтому рассмотрим небольшой пример, в котором будем изменять угол положения двух servo подключённых к Arduino UNO по схеме.

 двух servo подключённых к Arduino UNO по схеме

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

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

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

Итог: Как видим из примеров, применение джойстика достаточно большое в разработке проектов на Arduino и в робототехнике.

 двух servo подключённых к Arduino UNO

Если вас интересует дополнительная информация о джойстике, пишите об этом в комментариях.

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
#21. Подключаем к Arduino Шаговый двигатель 28BYJ-48 на драйвере ULN2003 http://portal-pk.ru/news/250-podklyuchaem-k-arduino-shagovyi-dvigatel-28byj-48-s-pomoshchyu.html Константин Portal-PK 2020-03-06T13:02:07+03:00 Сегодня в уроке подключим шаговый двигатель 28BYJ-48 к Arduino и научимся вращать вал двигателя в разные стороны и изменять скорость вращения с помощью потенциометра и энкодера KY-040.

Кратко, что такое шаговый двигатель (ШД) - это двигатель, который способен осуществлять вращение на 1 шаг. Шаг — это угол, который обусловлен устройством каждого конкретного шагового двигателя.

Характеристики шагового двигателя 28BYJ-48:

Характеристики шагового двигателя 28BYJ-48:

Размера шагового двигателя 28BYJ-48. Необходимы при проектировании деталей для 3D печати.

Размера шагового двигателя 28BYJ-48. Необходимы при проектировании деталей для 3D печати.

Вот так выглядит схема шагового двигателя 28BYJ-48

Вот так выглядит схема шагового двигателя 28BYJ-48

Подавая сигналы в определённом порядке на выводы двигателя, двигатель можно вращать по часовой стрелке.

Для шагового режима.

Для шагового режима.

Для полушагового режима.

Для полушагового режима.

Прямое подключение шагового двигателя 28BYJ-48 к Arduino.

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

Схема подключения к Arduino UNO будет следующая.

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

Для вращения ШД достаточно подавать сигналы по схеме, которую мы рассмотрели выше.

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

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

И в цикле выполнять каждую строчку массива. Но есть решение с более компактным кодом. Нашел я данный пример на канале Дмитрия Осипова. За что ему отельное спасибо!

Код для вращения в одну и в другую сторону будет вот таким.

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

Пример подключения шагового двигателя 28BYJ-48 (5V)с использованием драйвер ULN2003.

Также у Дмитрия Осипова есть код для изменения скорости вращения с помощью потенциометра. Я его немного доработал, сделал обработку нажатия кнопки без задержки в 500 мс. Сейчас двигатель стал вращаться в обратную сторону без видимой задержки.

Для подключения буду использовать модуль SBT0811 на драйвере ULN2003.

Для подключения буду использовать модуль SBT0811 на драйвере ULN2003.

Драйвер устроен вот таким образом.

Драйвер устроен вот таким образом.

Соответственно, наш код будет работать и с данным драйвером.

Подключим все по схеме и загрузим код в Arduino NANO.

Подключим все по схеме и загрузим код в Arduino NANO.

Схема подключения для Arduino UNO будет аналогичной.

Как видим, двигатель без проблем вращается по часовой стрелке и против часовой, при нажатии на кнопку вращается в противоположном направлении. При вращении потенциометра в одну сторону - скорость уменьшается, при вращении в противоположном направлении скорость увеличивается.

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

Пример управления шаговым двигателем 28BYJ-48 с помощью Энкодера.

Для уменьшения количества элементов в схеме решил заменить потенциометр и тактовую кнопку на энкодер вращения KY-040. Как подключить энкодер вращения к Arduino рассказывал в предыдущем уроке.

Подключаем шаговый двигатель 28BYJ-48 и энкодер к Arduino по схеме.

Подключаем шаговый двигатель 28BYJ-48 и энкодер к Arduino по схеме.

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

Если нажать на энкодер, меняется направление вращения. А при вращении энкодера по часовой стрелке - скорость увеличивается. Если вращать против часовой стрелки - скорость снижается.

Если нажать на энкодер, меняется направление вращения. А при вращении энкодера по часовой стрелке - скорость увеличивается. Если вращать против часовой стрелки - скорость снижается.

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

Вы также можете без проблем воспользоваться примером из стандартной библиотеки Stepper, которая позволит сделать тоже самое и при меньшем объёме кода. Но библиотека не даст вам понять, как это все устроено.

стандартной библиотеки Stepper

А вот сам пример вращения в одну сторону, а затем в другую с использованием библиотеки Stepper.

А вот сам пример вращения в одну сторону, а затем в другую с использованием библиотеки Stepper.

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

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

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
#20 Плейлисты, воспроизводим случайную композицию DFPlayer Mini и Arduino. http://portal-pk.ru/news/249-pleilisty-vosproizvodim-sluchainuyu-kompoziciyu-dfplayer-mini.html Константин Portal-PK 2020-03-04T13:18:26+03:00 В продолжение урока: Делаем MP3-плеер на DFPlayer Mini и Arduino. Рассмотрим, как можно создавать плейлисты для воспроизведения композиции с автоматическим определением количества плейлистов и количества треков в каждом плейлисте. А также сделаем воспроизведение случайного трека и зациклим воспроизведение композиции в одной папке.

В продолжение урока:Делаем MP3-плеер на DFPlayer Mini и Arduino. Рассмотрим, как можно создавать плейлисты

После того, как я сделал урок с использованием MP3-плеера написал мне подписчик: «познавательное видео! а можешь рассказать как сделать, например, 10 папок с музыкой и в них 10 музыкальных фрагментов, как подключаются кнопки выбора по папкам, и оставить громкость + - , воспроизведение и стоп? Я видел схему с множеством резисторов, для определения, например, каждой кнопки - музыкальному отрывку, но не нашел как подключить кнопки выбора папок - буду признателен за помощь!»

После того, как я сделал урок с использованием MP3-плеера написал мне подписчик

Решил я помочь подписчику и сделать урок с использованием DFPlayer и Arduino. Реализовать выбор папки и включение нужного mp3 файла. Но как сделать так, чтобы не нужно было каждый раз прописывать в коде, сколько у нас папок и сколько треков в каждой папке. А чтобы Arduino проделывала роботу по определению количества папок и треков. Ограничение DFPlayer Mini - максимум плейлистов 99, и треков в плейлисте 999, - и этого достаточно для решения, практически, любой задачи.

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

Для урока MP3-плеера на Arduino нам понадобится:

1. Arduino UNO или Arduino NANO

2. DFPlayer Mini.

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

6. 2 резистора на 10 кОм.

Подключаем MP3-плеера DFPlayer к Arduino по схеме.

Подключаем MP3-плеера DFPlayer к Arduino по схеме.

Пример работы с выбором папок, и композиции в них на DFPlayer.

Приступим к реализации просьбы подписчика. На карте памяти сделаем несколько папок с порядковыми номерами 01, 02, 03, 04 .. 11. В моем случае 11 папок, вы можете сделать любое количество.

На карте памяти сделаем несколько папок с порядковыми номерами 01, 02, 03, 04 .. 11.

Загрузим в каждую папку треки от 10 до 14. Вот так это будет выглядеть на карте памяти.

Загрузим в каждую папку треки от 10 до 14. Вот так это будет выглядеть на карте памяти.

За основу возьмем код из предыдущего урока и немного его доработаем. Добавим переменные, которые будут отвечать за папки и треки.

 Добавим переменные, которые будут отвечать за папки и треки.

В блоке Setup добавим код, который будет считать, сколько у нас папок на карте памяти. И сохраним это значение в переменную folders.

В блоке Setup добавим код, который будет считать, сколько у нас папок на карте памяти. И сохраним это значение в переменную folders.


Переменная folders получается на 1 больше, чем на карте. Сейчас мы можем, без проблем, добавлять папки на нашу карту памяти и MP3-плеер автоматически определит сколько их. Папок может быть не больше 99, и название должно состоять из 2 цифр.

Посчитаем сколько треков в первом каталоге.

Посчитаем сколько треков в первом каталоге.

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

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


Кнопка buttonNext будет переключать папки, а buttonPrevious – будет переключать по трекам в выбранной папке.

Переключать по трекам и по папкам будем в сторону увеличения. Можно сделать переключение в обратную сторону, но нужно добавить еще 2 кнопки. И дописать соответствующий код. Это вы сможете сделать самостоятельно, если это будет вам необходимо.

Рассмотрим код переключения по папкам:

Рассмотрим код переключения по папкам:

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

 Почему нужно вычитать 1 рассказывал выше.

Затем нам нужно подсчитать, сколько треков в данной папке.

Затем нам нужно подсчитать, сколько треков в данной папке.

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

включаем первый трек из данной папки

Если вы планируете воспроизводить с первого трека при переключении между папками, нужно убрать условие и оставить j = 1;. Осталось воспроизвести трек и вывести информацию в монитор порта номер трека и номер папки, в которой находится трек.


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

Это не оптимальный код. Его можно упростить и сделать быстрее, но для понятия будет сложнее.

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

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

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

В мониторе порта это будет выглядеть вот так:

В мониторе порта это будет выглядеть вот так:

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

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

Если трек последний, то при следующем нажатии на кнопку, переключаемся на первый трек в текущей папке.

При выборе последней папки, если нажать на кнопку переключить папку, переключаемся на первую папку. Если трек последний, то при следующем нажатии на кнопку, переключаемся на первый трек в текущей папке.

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


Зациклить воспроизведение композиций в папке, и случайное воспроизведение всех треков на DFPlayer и Arduino.

Данный пример отлично подойдёт для реализации плеера. Можно создать набор папок, каждая является отдельным плейлистом: по жанрам, настроению и пр. Перелистываем и выбираем, что хотели бы послушать. Также можно сделать список плейлистов, и выводить из какого плейлиста играет музыка. Планирую данный алгоритм работы добавить в умные часы на дисплее Nextion. Поэтому подписывайтесь на канал и вступайте в группу Вконтакте, чтобы не пропустить новые уроки и проекты на Arduino.

Схема подключения будет аналогично предыдущему примеру.

Схема подключения будет аналогично предыдущему примеру.

Код тоже возьмём из предыдущего примера и немного его изменим. Переменных нам нужно будет меньше:

Код тоже возьмём из предыдущего примера и немного его изменим. Переменных нам нужно будет меньше:

Кнопка buttonNext будет переключать воспроизведение папок.

Кнопка buttonNext будет переключать воспроизведение папок.

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

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

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

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

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

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

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

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Проекты часов на Arduino. От часов на светодиодах до часов на дисплее Nextion. http://portal-pk.ru/news/248-proekty-chasov-na-arduino-ot-chasov-na-svetodiodah-do-chasov.html Константин Portal-PK 2020-03-03T18:24:51+03:00 Разрабатываю часы на Arduino уже несколько лет подряд. Решил поместить все свои проекты часов на Arduino на одну страницу, чтобы самому знать, сколько часов сделано, и, при необходимости, показать заинтересованным читателям, знакомым и родственникам.

Это я решил сделать в связи с тем, что часто спрашивают:

  • А что ты можешь сделать?
  • Например, часы - отвечаю я.
  • А покажи примеры!

И тут я начинаю искать по сайту, что показать. А в конце вопрос: это ты сделал 5 различных часов на Arduino? Или больше? И тут начинаем листать обратно, считая сколько часов я сделал.

Поэтому решил все часы выложить тут:

6. Часы на OLED дисплее SSD1306 и Arduino.

Oled часы с выводом температуры на Arduino своими руками. Еще один интересный проект часов на OLED дисплее SSD1306 и Arduino. Данные часы небольшого размера, но обладают функциями полноценных часов. Часы выводят температур, дату и время. Благодаря двум тактовым кнопкам можно настроить дату и время.

5. Часы без кнопок с сенсорным дисплеем Nextion и Arduino.

Часы на Arduino и дисплее Nextion с выводом температуры и влажности.

Вам не нравятся часы с вечно чикающими кнопками? Представляю вашему вниманию часы с сенсорным экраном Nextion, и Arduino.

Часы выводят дату, время температуру и влажность. Также позволяют настраивать время и дату. И все это делается на экране без единой внешней кнопки. Как это по-современному.

Часы будут доработаны, и ожидается новая версия часов на Arduino с дисплеем Nextion с еще большим функционалом.

4. Часы матрица на Arduino и адресных светодиодах WS2812.

Светодиодные часы своими руками на ардуино (Arduino) WS2812 управляемых (адресных)

После того, как я купил себе 3D принтер, стал активно делать проекты с использованием 3D печати. Одним их проектов стали часы-матрица с выводом времени и даты на матрицу 16х5 пикселей. Получились отличные часы с возможностью настраивать время и дату. Но в связи с тем, что печатал решётку для светодиодов пластиком PLA, то на внешних контурах он потрескался уже через полгода. Нужно перепечатать внешнюю решётку ABS пластиком. Но пока не доходят руки.

3. LEGO часы на Arduino.

Часы-будильник на Arduino. Корпус сделан из конструктора LEGO.  LEGO Arduino

Задали ребёнку сделать «умный проект в доме». После недолгих размышлений решили сделать Arduino часы из LEGO. Добавили в часы спикер, и кнопку для отключения будильника. Часы не только работали и показывали текущее время, но и в них был запрограммирован будильник, который срабатывал в 07:00. Все отлично, но работал будильник каждое утро, и даже в выходные дни. Не смотря на то, что часы нравились ребенку, они проработали недолго. Ребенок разобрал корпус для своего строения из LEGO.

2. Светодиодные часы на адресных светодиодах WS2812 и Arduino.

Классные самодельные настенные светодиодные часы на arduino

Часы состоят из 3 круглых контуров, по которым располагаются светодиоды. Внешний контур показывает минуты с кратностью 5. Если светиться 1 светодиод, значит 5 мин, 2 – 10 мин и т.д. По аналогии работы стрелочных часов. Средний контур, с выфрезерованными цифрами 3,6,9,12, – это часовой индикатор, который показывает сколько часов. И маленький контур с 4 светодиодами указывает сколько минут нужно добавить к минутам, которые получаются на внешнем контуре, т.е если на внешнем контуре светиться 3 светодиода, а на маленьком 2 то значит сейчас 17 минут (15+2). Заполняем минуты, которые нельзя показать на внешнем контуре.

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

1.Arduino часы на сдвиговых регистрах и 28 светодиодах. С выводом температуры и влажности на семисегментный индикатор TM1637.

Arduino часы - Видео 4. Делаем корпус и собираем Arduino часы

Часы состоят из 28 светодиодов, которые показывают тегирующее время. Также время дублируется на семисегментный индикатор TM1637. Также на TM1637 выводится влажности и температура в помещении. Время настраивается с помощью пульта дистанционного управления.

]]>
Урок 19. Делаем MP3-плеер на DFPlayer Mini и Arduino. http://portal-pk.ru/news/247-delaem-mp3-pleer-na-dfplayer-mini-i-arduino.html Константин Portal-PK 2020-02-28T14:05:54+03:00 Как воспроизвести аудиофайлы в формате wav я уже рассказывал в уроке: Arduino SD карта. Воспроизводим звуки и музыку в wav формате. Данный способ подходит, когда нужно воспроизвести файлы не очень высокого качества, например, уведомления, оповещение и пр. Если же надо воспроизводить файлы в формате mp3, нам поможет модуль DFPlayer Mini.

модуль DFPlayer Mini

MP3-плеер DFPlayer Mini позволяет воспроизводить аудиофайлы, записанные на карту памяти формата microSD. С помощью этого плеера можно управлять музыкой: приостановка и возобновление воспроизведения аудиофайла. А также можно установить громкость из 30-ти уровней громкости и одни из 6-ти режимов эквалайзера.

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

Характеристики DFPlayer MP3 mini:

Характеристики DFPlayer MP3 mini:

  • Напряжение питания: 3,3–5 В
  • Количество каналов: 1 моно, 3 Вт + 2 стерео, без усилителя
  • Поддерживаемые частоты дискретизации: 8, 11, 12, 16, 22, 24, 32, 44,1, 48 кГц
  • Разрядность ЦАП: 24 бита
  • Поддерживаемые файловые системы: FAT16, FAT32
  • Максимальный объём SD-карты: 32 ГБ
  • Количество каталогов композиций: до 100
  • Количество композиций в каталоге: до 255
  • Форматы аудиофайлов: MP3, WAV, WMA
  • Кол-во уровней громкости: 30
  • Режимов эквалайзера: 6 (Normal/Pop/Rock/Jazz/Classic/Base)

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

Для реализации самого простого плеера не нужно подключать DFPlayer к Arduino.

Но у нас уроки про Arduino, поэтому рассмотрим простой пример подключения MP3-плеер к Arduino, который подключается по аппаратному или программному UART порту (пины RX и TX) Ардуино.

Код с выводом отладочной информацией будет вот таким. Данный код взят с сайта библиотеки DFRobotDFPlayerMini. Также нам понадобится библиотека для работы спрограммным UART портом SoftwareSerial.Скачать библиотеки можно внизу статьи, в разделе материалы для скачивания.

Для воспроизведения аудиофайла необходимо поместить на карту памяти microSD один трек. Файлы рекомендуется помещать в папку mp3 и называть порядковыми номерами вот в таком формате 0001.mp3. Мой опыт показывает, что можно скидывать файлы с любым названием и помещать в корень флешки, но воспроизводиться файлы будут в том порядке, в каком их загрузилина карту памяти. При пакетной загрузке одни файлы загружаются быстрее, а другие медленнее, из-за чего воспроизведение треков идет в хаотичном порядке.

Пример MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости.

Давайте сделаем полноценный MP3-плеера на Arduino. Для этого нам понадобится:

1. Arduino UNO или Arduino NANO

2. DFPlayer Mini.

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

6. 2 резистора на 10 кОм.

Все компоненты нашего будущего MP3-плеера на DFPlayer соединяем по схеме.

Все компоненты нашего будущего MP3-плеера на DFPlayer соединяем по схеме.


Загрузим файлы с треками на карту памяти microSD, я использую 3 трека с YouTube, чтобы можно было воспроизводить музыку в видеоролике и не получить бан. Архив с треками можно скачать внизу статьи, в разделе материалы для скачивания.

Загрузим файлы с треками на карту памяти microSD, я использую 3 трека с YouTube

Код для MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости будет вот такой.

#include "DFRobotDFPlayerMini.h"
// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySoftwareSerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 10, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 11, необходимо соединить с выводом RX дисплея
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX для плеера DFPlayer Mini 
DFRobotDFPlayerMini myDFPlayer;
int buttonNext = 2;   // кнопка следующий трек
int buttonPause = 3;  // кнопка пауза/ пуск
int buttonPrevious = 4; // кнопка предыдущий трек 
int buttonVolumeUp = 5; // кнопка увеличение громкости
int buttonVolumeDown = 6; // кнопка уменьшение громкости
boolean isPlaying = false; // статус воспроизведения/пауза
void setup() {
  pinMode(buttonPause, INPUT_PULLUP); 
  pinMode(buttonNext, INPUT_PULLUP);
  pinMode(buttonPrevious, INPUT_PULLUP);
  pinMode(buttonVolumeUp, INPUT_PULLUP);
  pinMode(buttonVolumeDown, INPUT_PULLUP);
  mySoftwareSerial.begin(9600); 
  Serial.begin(9600);
  delay(1000);
  Serial.println();
  Serial.println("DFPlayer Mini Demo");
  Serial.println("Initializing DFPlayer...");
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("Unable to begin:");
    Serial.println("1.Please recheck the connection!");
    Serial.println("2.Please insert the SD card!");
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.setTimeOut(300);
  //----Set volume----
  myDFPlayer.volume(15); //Set volume value (0~30).
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  myDFPlayer.play(1); //Воспроизведение первого mp3
  isPlaying = true; // воспроизводим
  Serial.println("Playing..");
  //----Читать информацию----
  Serial.println(myDFPlayer.readState()); //читать состояние mp3
  Serial.println(myDFPlayer.readVolume()); //Текущая громкость 
  Serial.println(myDFPlayer.readEQ()); // читаем настройку эквалайзера
  Serial.println(myDFPlayer.readFileCounts()); // читать все файлы на SD-карте
  Serial.println(myDFPlayer.readCurrentFileNumber()); // текущий номер файла воспроизведения
}
void loop() {
  if (digitalRead(buttonPause) == LOW) {
    if (isPlaying) { // если было воспроизведение трека
      myDFPlayer.pause(); // пауза
      isPlaying = false; // пауза
      Serial.println("Paused..");
    } else {        // иначе
      isPlaying = true; // воспроизводим
      myDFPlayer.start(); //запускаем mp3 с паузы
    }
    delay(500);
  }
  if (digitalRead(buttonNext) == LOW) {
    if (isPlaying) {
      myDFPlayer.next(); //Next Song
      Serial.println("Next Song..");
    }
    delay(500);
  }
  if (digitalRead(buttonPrevious) == LOW) {
    if (isPlaying) {
      myDFPlayer.previous(); //Previous Song
      Serial.println("Previous Song..");
    }
    delay(500);
  }
  if (digitalRead(buttonVolumeUp) == LOW) {
    if (isPlaying) {
      myDFPlayer.volumeUp(); //Volume Up
      Serial.println("Volume Up..");
    }
    delay(500);
  }
  if (digitalRead(buttonVolumeDown) == LOW) {
    if (isPlaying) {
      myDFPlayer.volumeDown(); //Volume Down
      Serial.println("Volume Down..");
    }
    delay(500);
  }
}

У платы Arduino NANO всего один аппаратный Serial Port, поэтому будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.

подключить библиотеку SoftwareSerial.h.

Чтоб проверить, подключен или нет DFPlayer используется условие:

Чтоб проверить, подключен или нет DFPlayer используется условие:

Если в мониторе порта мы видим надпись «DFPlayer Mini online.» все подключено правильно и работает.

Данные строки кода

Включают первый трек. И выводят в монитор порта информацию об этом.

Включают первый трек. И выводят в монитор порта информацию об этом.

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

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

Первая строчка выводит статус: цифра с кодом.

Вторая строчка выводить уровень текущей громкости от 0 до 30

Третья выводит настройки эквалайзера, также в цифровом значении.

Четвертая выводит, сколько треков найдено на карте памяти.

Последняя стока выводит, какой трек воспроизводится сейчас.

В мониторе порта это будет выглядеть вот так:

В мониторе порта это будет выглядеть вот так:

В основном цикле loop выводим условия проверки нажатия той или иной кнопки. И выполняем нужную команду.

  if (digitalRead(buttonNext) == LOW) {
    if (isPlaying) {
      myDFPlayer.next(); //Next Song
      Serial.println("Next Song..");
    }
    delay(500);
  }

Это одно условие для примера, остальные устроены аналогично, их рассматривать не будем. Список команд для работы с DFPlayer Mini myDFPlayer.next(); // Воспроизвести следующий mp3

  myDFPlayer.previous();  // Воспроизвести предыдущий mp3
  myDFPlayer.play(1);  //Воспроизведение первого mp3
  myDFPlayer.loop(1);  //зациклить первый mp3
  myDFPlayer.pause();  //приостановить mp3
  myDFPlayer.start();  //запускаем mp3 с паузы
  myDFPlayer.playFolder(15, 4);  //воспроизводить определенный mp3 в SD: /15/004.mp3; Имя папки (1 ~ 99);
  myDFPlayer.enableLoopAll(); //зациклить все mp3 файлы.
  myDFPlayer.disableLoopAll(); //остановить цикл всех mp3 файлов.
  myDFPlayer.playMp3Folder(4); //воспроизводить конкретный mp3 в SD: /MP3/0004.mp3; Имя файла (0 ~ 65535)
  myDFPlayer.advertise(3); //рекламируем конкретный mp3 в SD: /ADVERT/0003.mp3; Имя файла (0 ~ 65535
  myDFPlayer.playLargeFolder(2, 999); //воспроизводить конкретный mp3 в SD: /02/004.mp3; Имя папки (1 ~ 10); Имя файла (1 ~ 1000)    
  myDFPlayer.loopFolder(5); //зациклить все mp3 файлы в папке SD: / 05.
  myDFPlayer.randomAll(); //Произвольное воспроизведение всех mp3.  
  myDFPlayer.enableLoop(); //включить цикл.
  myDFPlayer.disableLoop(); //отключить цикл

Как видите, не так много кода и алгоритм работы достаточно несложный. Планирую реализовать пару проектов с использованием модуля DFPlayer Mini и Arduino, ESP8266, ESP32 для публикации на сайте. Благо, опыт работы с этим модулем и данными платформами есть.

ару проектов с использованием модуля DFPlayer Mini и Arduino, ESP8266, ESP32 для публикации на сайте.

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

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Ночник со стеклянными шарами на Arduino своими руками. http://portal-pk.ru/news/246-nochnik-so-steklyannymi-sharami-na-arduino-svoimi-rukami.html Константин Portal-PK 2020-02-27T15:06:47+03:00 Сегодня расскажу про светильник, который сделал своими руками на Arduino (DigiSpark). В качестве рассеивателя установил стеклянные шарики, которые фиксируются с помощью оргстекла молочного цвета.

Заготовки для светильника вырезал на своем самодельном фрезерном ЧПУ станке больше года назад. После склейки корпуса установил электронику и протестировал работу. Но меня не устроили некоторые моменты и проект отложил. И вот, дошли руки его доработать. Изначально стеклянные шарики прижимались куском фанеры, и свет плохо рассеивался. Чтобы устранить данный конструктивный изъян заменил верхнюю часть на 2 детали. Стеклянные шарики зажимаются оргстеклом и для того, чтобы стекло сильно не прогибалось, фиксирую его куском фанеры. Такая конструкция позволяет надежно зафиксировать шарики без прогиба оргстекла.

Сегодня расскажу про светильник, который сделал своими руками на Arduino (DigiSpark).

К сожалению, раскроя фанеры нет, так как у меня сломался жёсткий диск, и часть информации было утеряно, в том числе и раскрой фанеры для данного светильника. Но возможно, осталась копия на рабочем компьютере, который стоит для управления самодельным ЧПУ станком на Arduino. Если найду, то обязательно выложу внизу стати в разделе материалы для скачивания.

А пока хочу с вами поделиться информацией которую узнал недавно. А именно Дедик сервер – это устоявшееся название выделенного сервера, который используется под всевозможные задачи. Также он называется dedicated или dedicated server. Купить дедик на месяц и год предпочитают многие и зачастую именно у нас, поскольку такой мощный по конфигурации и продуктивности сервер подключен к интернету с высокой скоростью и функционирующий долгое время без перезагрузок и отключений. Все это позволяет решать разные задачи.

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

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

Электроника и схема подключения самодельного светильника на Arduino (DigiSpark).

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

  • Digispark
  • Адресные светодиоды WS2812
  • Резистор 10 кОм
  • Бокс под батарейки 4 x AA
  • Кнопка без фиксации
  • Кнопка с фиксацие

Подключаем все компоненты светильника на Arduino по вот такой схеме.

Подключаем все компоненты светильника на Arduino по вот такой схеме.

Вместо DigiSpark можно использовать Arduino NANO. Подключить кнопку и адресные светодиоды можно к любому цифровому пину Arduino.

Данный проект, по электронным комплектующим и схеме подключения, схож с проектом светофора на адресных светодиодах WS2812.

Прошивка для самодельного светильника на Arduino.

#include <Adafruit_NeoPixel.h>
#define PIN 0
#define STRIPSIZE 3
byte button_rejim = 1;  // кнопка режим
int rejim = 0;       // текущий режим
int yarkast = 250;       // текущая яркасть
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
int wait = 15;
uint16_t j = 0;
uint16_t i = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPSIZE, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  pinMode(button_rejim, INPUT); // настроить пин кнопки
  strip.begin();
}
boolean debvance (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) // Проверяем отпускали мы кнопку или нет
  {
    rejim++; // изменяем режим
    i = 0;
    if (rejim == 3)
      rejim = 0;
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  if (rejim == 0)
  {
    if (j < 256) {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel((i + j) & 255));
      }
      delay(wait);
      j++ ;
    }
    if (j == 255)
      j = 0;
  }
  else if (rejim == 1)
  {
    if (j < 256 * 5) { // 5 cycles of all colors on wheel
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
      }
      delay(wait);
      j++;
    }
    if (j == 255)
      j = 0;
  }
  else if (rejim == 2) // радуга из центра
  {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(255, 255, 255));
      delay(wait);
    }
  }
  strip.setBrightness(yarkast);  // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
}
uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
void colorWipes(uint32_t c, int num) {
  for (i = 0; i < strip.numPixels(); i++) {
    if (i == num)
      strip.setPixelColor(i, c);
    else
      strip.setPixelColor(i, strip.Color(0, 0, 0));
  }
  strip.setPixelColor(num, c);
  strip.show();
  delay(1);
}

Перед установкой электроники нужно запрограммировать DigiSpark или Arduino.

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

Как запрограммировать Arduino смотрите тут. Загрузка скетча в DigiSpark происходит немногого по-другому. Сначала нажимаете кнопку загрузить код, после того как код скомпилируется и выйдет надпись, у вас будет 60 секунд для подключения DigiSpark к компьютеру.

Загрузка скетча в DigiSpark происходит немногого по-другому.

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

Кнопка с фиксацией включает и выключает питание. Тактовая кнопка переключает режимы.

У светильника есть 3 режима роботы:

  • Плавная смена цвета всех светодиодов одновременно.
  • Смена цветов у каждого светодиода свой цвет.
  • Белый цвет свечения всех светодиодов.

Светильник запрограммирован и собран. Можно приступить к тестированию.

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

Батареек самых дешевых хватит примерно на 5-7 ночей. Это достаточно неплохой результат.

Батареек самых дешевых хватит примерно на 5-7 ночей. Это достаточно неплохой результат.

И еще немного фото самодельного светильника на Arduino (DigiSpark).

И еще немного фото самодельного светильника на Arduino (DigiSpark).

Если есть вопросы, проблемы, предложения и пожелания, пишите их в комментариях. Комментарий можно написать без регистрации на сайте.

На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока.

До встречи в новом проекте.

]]>
ESP32-CAM сохраняем фотографии на флешку при движении http://portal-pk.ru/news/245-esp32-cam--sohranyaem--fotografii-na-fleshku-pri-dvizhenii.html Константин Portal-PK 2020-02-20T12:33:42+03:00 Сегодня в проекте на ESP32 научим ESP32-CAM модуль делать фотографии при движении объекта и сохранять фотографии на флешку. Название кадра будет содержать дату и время, когда было сделано фото.

научим ESP32-CAM модуль делать фотографии при движении объекта и сохранять фотографии на флешку

У PIR датчика HC-SR501 на выходе 3,3в, что позволяет нам подключить датчик движения к ESP32 без дополнительных преобразователей и пр.

Спонсор видео NextPCB. 0$ первый пробный заказ печатных плат от NextPCB.

Корпус для esp32 cam ov2640.

Корпус самостоятельно делать не пришлось, так как готовые варианты есть в интернете. Скачал я пару моделей и напечатал на 3D принтере. Вот что получилось.

 Скачал я пару моделей и напечатал на 3D принтере. Вот что получилось.

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

Кроме модуля можно установить разъем micro-USB, что позволит подключать ESP32-CAM wifi к телефонному зарядному устройству или power bank.

Кроме модуля можно установить разъем micro-USB

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

Для проекта нам понадобиться: ESP32-CAM модуль ov2640.

Приступим к установке, настройке необходимого ПО и прошивке ESP32. Для удобства я разделил всё на несколько этапов:

1. Установка дополнения ESP32
В этом примере будем использовать Arduino IDE для программирования платы ESP32-CAM. Установите Arduino IDE, и настройте работу с ESP32. Если этого у вас не сделано, воспользуетесь следующей инструкцией:

Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux)

2. Код проекта. Меняем все необходимые параметры.
В среде Arduino IDE открываем код:

В среде Arduino IDE открываем код:

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

String _ssid= "Имя_точки_wi-fi "; // Для хранения SSID
String _password = "пароль_от_wi-fi // Для хранения пароля сети

Больше настраивать не нужно, код готов к загрузке в ESP32.

3. Прошивка ESP32-CAM

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

Подключаю всё вот по такой схеме:

 Прошивка ESP32-CAM

Важно! GPIO 0 должен быть подключен к GND, чтобы вы смогли загрузить код.

Чтобы загрузить код, выполните следующие действия:

  • Перейдите в меню Инструменты > Плата и выберите модуль Al Thinker ESP32-CAM
  • Перейдите в меню Инструменты > порт и выберите COM-порт, к которому подключен ESP32
  • Нажмите кнопку ESP32-CAM on-board RESET
  • Затем нажмите кнопку Загрузка, чтобы загрузить код

Перейдите в меню Инструменты выберите модуль Al Thinker ESP32-CAM

Важно! Если вы не можете загрузить код, то еще раз проверьте, что GPIO 0 подключен к GND и, что вы выбрали правильные настройки в меню Инструменты. Вы также должны нажать кнопку сброса на борту, чтобы перезагрузить ESP32 в режиме программирования.

Код загружен, сейчас нужно все собрать в корпус.


ESP32-CAM схема подключения.

Для проверки работы собираем все элементы на макетной плате по схеме.

Для проверки работы собираем все элементы на макетной плате по схеме.

Вот так это выглядит в живую.

Вот так это выглядит в живую.

При движении получаются вот такие фото.

Котэ попал в кадр. Модуль работает.

Котэ попал в кадр. Модуль работает.

Для подключения к micro usb dip 5 pin нужно припаять 4 провода. Как-то вот так.

Для подключения к micro usb dip 5 pin

Укладываем все в корпус. В задней крышке сделал отверстия для проводов, которые подключаются к PIR датчику HC-SR501. Датчик приклеил на двухсторонний скотч сверху, так чтобы был доступ к подстроечным резисторам.

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

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

Установил ESP32-CAM sending photo на техническую полку выше холодильника.

Установил ESP32-CAM sending photo на техническую полку выше холодильника.

Настроил время срабатывания и дистанцию PIR датчика HC-SR501. Смотрел вот по такому примеру.

Настроил время срабатывания и дистанцию PIR датчика HC-SR501.

К сожалению, у меня время срабатывания максимум секунд 30, но этого достаточно для данного проекта. Если время срабатывания датчика настроить 5 сек или меньше, то у модуля esp32 cam получается очередь, так как время на фотографирование и сохранение в память занимает больше 5 секунд. И пока не закончиться очередь, он будет фотографировать, если даже в поле срабатывания ни кто не двигается.

В итоге получаются вот такие фото.

В итоге получаются вот такие фото.

Качество не очень, так как в коридоре освещение, как правило, делают не яркое. У меня не исключение. Да и модуль камеры ov2640 снимает с качеством 2МРх. Что от него ожидать?

Без освещения камера включает свою подсветку, и результат получается вот такой.

Без освещения камера включает свою подсветку, и результат получается вот такой.

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

Второй минус - это запрет на многие символы в названии файлов, поэтому время и дата выводятся не совсем в привычном формате, но все равно понятном.

Второй минус - это запрет на многие символы в названии файлов, поэтому время и дата выводятся не совсем в привычном формате, но все равно понятном.

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

На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока.

До встречи в новом проекте.

]]>
#18. Урок Nextion дисплей на русском, анимация на дисплее без Arduino. http://portal-pk.ru/news/244-urok-nextion-displei-na-russkom-animaciya-na-displee-bez.html Константин Portal-PK 2020-02-18T14:08:47+03:00 Сегодня в уроке научимся делать анимацию и выводить ее на дисплей Nextion. Вся программная часть будет реализована с использованием возможностей Nextion Editor, без использования Arduino.

Подготавливаем картинки для вывода анимации на экран Nextion.

Nextion display не умеет выводить gif анимацию или видео на экран. Это касается старых моделей. Новые модели, скорее всего, умеют воспроизводить видео и звук, так как в Nextion Editor появились инструменты позволяющие добавлять элементы медиа. Но у меня нет таких дисплеев, поэтому будем делать анимацию по старинке. То есть покадрово. Для того, чтобы разбить gif анимацию на кадры я использую онлайн сервис picasion.

разбить gif анимацию на кадры я использую онлайн сервис picasion

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

Анимация процесса загрузки.

Самая простая анимация, но при этом одна из самых распространенных - это анимация загрузки. Для начала создадим новый проект в Nextion Editor, если вы не знаете, как это сделать, смотрите урок: Nextion Editor урок 1. Скачиваем и первый пример hmi.

Анимация процесса загрузки.

Затем загрузим картинки для анимации. Для этого в панели Picture 1- нажмем на кнопку в виде плюса. В отрывшемся окне 2 выберем нужные картинки и нажмем на копку «Открыть» – 3.

панели Picture У нас получиться список картинок с порядковыми номерами от 0 до 51, которые мы и будем использовать.

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

В панели инструментов «Toolbox» выбираем элемент «Timer», этот элемент невидимый и он появиться в панели элементов данного типа.


Выбираем элемент «Timer», его название - tm0

Выбираем элемент «Timer», его название - tm0. Установим значение 50 в параметре tim, это интервал срабатывания в миллисекундах, то есть картинка будет меняться каждые 50 мс. Теперь нам нужно написать код, который будет обновлять картинки, это будет небольшое условие.

На поле экрана нужно добавить картинкус номером 0. Это будет первый кадр.

На поле экрана нужно добавить картинкус номером 0. Это будет первый кадр.

Можно проверять Nextion пример анимации.

Можно проверять Nextion пример анимации.

Две кнопки по краям это просто перенаправление на другие страницы урока. Nextion hmi и tft nextion можно скачать внизу статьи, в разделе материалы для скачивания.


Эквалайзер при воспроизведении музыки.

Второй пример основан на первом. Загружаем nextion картинки и добавляем таймер.

Загружаем nextion картинки и добавляем таймер.

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

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

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

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

И добавим нужные элементы в проект.

И добавим нужные элементы в проект.

Напишем

следующий код для нажатия кнопки.


Напишем следующий код для нажатия кнопки.


Будем включать и выключать таймер 0, а также менять картинку кнопки.

Еще один nextion пример готов.Осталось запустить и проверить.

Nextion hmi и tft nextion можно скачать внизу статьи, в разделе материалы для скачивания.

Анимация по времени.

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

 отсчет времени на дисплее nextion без использования Ардуино

Загрузим картинки для кнопок и для анимации.

Анимация тут будет без повтора, поэтому код будет видоизменен.

Загрузим картинки для кнопок и для анимации.

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

Также добавим второй таймер и переменную.Переменная va0 остается без изменений, а параметр val должен быть равен 0.

Переменная va0 остается без изменений, а параметр val должен быть равен 0.

Для второго

таймера пропишем вот такой код.


Для второго таймера пропишем вот такой код.

Интервал tim для второго счетчика устанавливаем 500 мс. Рассмотрим код подробнее.


if(p1.pic==96)
{
  p1.pic=97
  p2.pic=97
}else
{
  p1.pic=96
  p2.pic=96
n0.val++
}

Если мы оставим только лишь эти строки, то мы увидим мигание точек у часов. Картинки 96 и 97 -это токи и просто белый фон. Они меняются местами с интервалом в пол секунды.

n0.val++ - добавляет ежесекундно «1» к числу в данном поле. И мы видим секунды на наших импровизированных часах.

va0.val=n0.val%10
  if(n0.val>=60)
  {
    n0.val=10
  }
  if(va0.val==0)
  {
    p0.pic=79
  }
  if(va0.val==2)
  {
    p0.pic=102
  }

va0.val=n0.val%10 получаем остаток от деления на 10 и сохраняем в переменнуюva0.val.

Когда время достигло 60 сек., то меняем значение на 10. Но по-хорошему это должен быть 0. Тогда будет полноценное изменение времени. Тут можно добавить прибавление минут ко второму числу часов, но я не стал писать много кода, чтобы было более понятно.

if(va0.val==0)
  {
    p0.pic=79
  }
  if(va0.val==2)
  {
    p0.pic=102
  }

Тут мы проверяем, какое значение в нашей переменной. Если остаток от деления равен 0, тогда задаём начальную картинку анимации, что автоматически запустит анимацию. Это прописано в нашем первом таймере. Если остаток от деления равен 2, то выводим белую картинку. Это закрывает последний кадр анимации.

По данному алгоритму анимация повторяется каждые 10 секунд. «Интервал», «время» и прочие параметры можно настроить и дописать для решения вашей задачи.

Чтобы запустить анимацию с использованием Arduino достаточно отправит на nextion display

значения для включения таймера.Как это сделать смотрите в nextion уроке: Дисплей Nextion урок 2. Подключаем и передаем данные на Arduino.

Если вам интересна эта тема, смотрите мой проект часов: Часы на Arduino и дисплее Nextion с выводом температуры и влажности. В данном проекте нашел пару недочётов, скоро будет доработанная версия с еще большим функционалом.

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

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Урок 17. Подключаем энкодер к Arduino. http://portal-pk.ru/news/243-podklyuchaem-enkoder-k-arduino.html Константин Portal-PK 2020-02-12T11:05:53+03:00 В данном уроке рассмотрим энкодер вращения и подключим его к Arduino.

Модуль KY-040 является энкодером вращения. Из названия понятно, что принцип его работы это вращение. А именно преобразование угла поворота в сигнал. Сигнал может быть цифровым и аналоговым. Более подробную информацию о видах энкодеров и принципе их действия можно почитать в интернете. Цель нашего урока подключить конкретный модуль к Arduino и научиться управлять внешними устройствами с помощью энкодера.

В данном уроке рассмотрим энкодер вращения и подключим его к Arduino.

Характеристики Энкодера KY-040:
Функция нажатия: Да
Количество импульсов на 360 гр. : 20
Число рабочих циклов: 30000
Вес: 5 грамм

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

Подключаем энкодер KY-040 к Arduino.

 Энкодер KY-040

Модуль имеет 5 контактов, это:

  • + и GND - линии питания и земли. Данный энкодер является механическим, питание для него не требуется, линии нужны для цепи с подтягивающими резисторами.
  • SW - вывод кнопки имеет потягивающий резистор, существует модули у которых при нажатии вывод замыкается на землю;
  • CLK и DT - выводы энкодера, они подтянуты к линии питания резисторами 10кОм;

Подключаем Энкодер KY-040 к Arduino UNO по схеме.

Подключаем Энкодер KY-040 к Arduino UNO по схеме.

Пример кода вывода информации о положении энкодера в монитор порта.

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

#define pin_CLK 2
#define pin_DT  4
#define pin_Btn 3
unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
uint8_t EncoderA, EncoderB, EncoderAPrev;
int16_t counter;
bool ButtonPrev;
eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime - LastTime >= 5) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние
    }
  }
  return Result;
}
void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
  pinMode(pin_Btn, INPUT); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
  Serial.begin(9600);
  counter = 0;
}
void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
  Serial.println(counter);

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

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

Если у вас получается противоположное значение, т.е. при вощении против часовой стрелки получаете положительное значение. Исправьте 2 строчки:

      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);

На вот такие.

       EncoderA = digitalRead(pin_DT);
       EncoderB = digitalRead(pin_CLK);

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


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

Для примера давайте подключаем к схеме выше еще 2 светодиода. В итоге схема подключения управления яркостью двух светодиодов с помощью энкодера и Arduino NANO будет вот такой.

схема подключения управления яркостью двух светодиодов с помощью энкодера и Arduino NANO

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

#define pin_CLK 2
#define pin_DT  4
#define pin_Btn 3
#define pin_led1 5 // пин подключения
#define pin_led2 6 // пин подключения


unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
uint8_t EncoderA, EncoderB, EncoderAPrev;
int8_t counter, brightness1, brightness2;
bool ButtonPrev;

eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime - LastTime >= 5) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      // EncoderA = digitalRead(pin_DT);
      // EncoderB = digitalRead(pin_CLK);
      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние
    }
  }
  return Result;
}

void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
  pinMode(pin_Btn, INPUT); // Кнопка подтянута к GND Иначе используем INPUT_PULLUP

  Serial.begin(9600);
  counter = 0;
}

void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
  Serial.println(counter);
  if (counter < 0)
  {
    brightness2 = -counter;
    brightness1 = 0;
  }
  else if (counter > 0)
  {
    brightness1 = counter;
    brightness2 = 0;
  }
  else
    brightness1 = 0, brightness2 = 0;
  analogWrite(pin_led1, brightness1);    // устанавливаем значение
  analogWrite(pin_led2, brightness2);    // устанавливаем значен
}

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

Вращение энкодера по часовой стрелке привет к тому, что загорается красный светодиод.

Энкодер широко используется в проектах на Arduino. Например, для управления работы 3D принтером используется как раз энкодер аналогичный KY-040. При разработке панели управления самодельным ЧПУ станком используется также энкодер. И это только малая доля использования энкодера. Большинство проектов, где используется потенциометр его можно заменить на энкодер. Пишите в комментариях, как вы используете энкодер.

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Oled часы с выводом температуры на Arduino своими руками. http://portal-pk.ru/news/242-oled-chasy-s-vyvodom-temperatury-na-arduino-svoimi-rukami.html Константин Portal-PK 2020-02-06T12:38:50+03:00 Я люблю разрабатывать различные часы на Arduino . Свои первые часы делал на сдвиговых регистрах, светодиодах и Arduino. Вторая версия светодиодных часов уже была сделана на адресных светодиодах (данные часы до сих пор работают и висят у меня в коридоре). С ребёнком делали часы из Лего, семисегментного индикатора и digispark. Последние, четвёртые, реализованы на Arduino и дисплее Nextion. Подписчики написали мне, что часы получаются достаточно дорогие и собирать их нецелесообразно. Согласен, что дисплей Nextion дорогой, поэтому решил собрать часы на OLED дисплее и Arduino.

Для реализации данного проекта нам понадобится:

Электронную часть OLED часов собрал на макетной плате вот по такой схеме.

Электронную часть OLED часов собрал на макетной плате вот по такой схеме.

Описание работы часов OLED часы на Arduino.

Часы имеют стандартный функционал. Вывод текущего дня недели, даты, времени и температуры. Две тактовые кнопки помогают нам настраивать дату и время.

Часы имеют стандартный функционал

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

Устанавливаем и настраиваем библиотеки.

1. Установить библиотеки Adafruit : библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX . Как их установить, я рассматривал в уроке.

2. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться. Вы можете скачать, библиотеку подготовленную для вывода русского текста, внизу статьи в разделе материалы для скачивания.

3. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно внизу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

4. Добавить в блок void setup() {} следующую строчку кода.

display.cp437(true);

5. При выводе русского текста использовать функцию utf8rus() .

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


Код OLED часы на Arduino.

Рассказывать, как устроена программа часов полностью не буду. Тем более у меня на сайте достаточно уроков и примеров по реализации функционалов на дисплеях и работы с часами реального времени. Рассмотрим только основную особенность данного кода - это вывод русского языка в том виде, как он прописан в самом коде. Библиотеку для вывода символов на дисплей мы установили и настроили. Как же сейчас её использовать так, чтобы постоянно не прописывать перекодировку символов? Для этого сделаем функцию, которая будет выводить наш текст с нужным размером шрифта по указанным координатам.

void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(utf8rus(text));
  display.display();
}

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

void display_day() { // вывод дня недели
  switch (day) {
    case 1:  draw_text(30, 0, "ВОСКРЕСЕНЬЕ", 1); break;
    case 2:  draw_text(30, 0, "ПОНЕДЕЛЬНИК", 1); break;
    case 3:  draw_text(30, 0, "  ВТОРНИК  ", 1); break;
    case 4:  draw_text(30, 0, "   СРЕДА   ", 1); break;
    case 5:  draw_text(30, 0, "  ЧЕТВЕРГ  ", 1); break;
    case 6:  draw_text(30, 0, "  ПЯТНИЦА  ", 1); break;
    default: draw_text(30, 0, "  СУББОТА  ", 1);
  }
}

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

/*
   Arduino часы с выводом температуры на DS3231 и SSD1306 OLED
   Сайт https://portal-pk.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://portal-pk.ru/page-18/proekty-na-nodemcu-esp8266-esp-01.html
*/
#include <Wire.h>                        // I2C 
#include <Adafruit_GFX.h>                // Включить графическую библиотеку Adafruit
#include <Adafruit_SSD1306.h>            // Включить драйвер OLED Adafruit SSD1306
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 // Высота OLED-дисплея в пикселях
// SSD1306, подключенного к I2C (выводы SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define button1    9                       // Кнопка B1 подключена к контакту Arduino 9
#define button2    8                       // Кнопка B2 подключена к контакту Arduino 8
void setup(void) {
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  delay(1000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализировать с помощью I2C адресс 0x3C (для 128x64)
  // Очистить дисплей.
  display.clearDisplay();
  display.display();
  display.cp437(true);
  display.setTextColor(WHITE, BLACK);
  display.drawRect(117, 56, 3, 3, WHITE);     // Поставить символ степени ( ° )
  draw_text(0, 56, "ТЕМПЕРАТУРА =", 1);
  draw_text(122, 56, "C", 1);
}
char Time[]     = "  :  ";
char Calendar[] = "  /  /20  ";
char temperature[] = " 00.00";
char temperature_msb;
byte i, second, minute, hour, day, date, month, year, temperature_lsb;
void display_day() { // вывод дня недели
  switch (day) {
    case 1:  draw_text(30, 0, "ВОСКРЕСЕНЬЕ", 1); break;
    case 2:  draw_text(30, 0, "ПОНЕДЕЛЬНИК", 1); break;
    case 3:  draw_text(30, 0, "  ВТОРНИК  ", 1); break;
    case 4:  draw_text(30, 0, "   СРЕДА   ", 1); break;
    case 5:  draw_text(30, 0, "  ЧЕТВЕРГ  ", 1); break;
    case 6:  draw_text(30, 0, "  ПЯТНИЦА  ", 1); break;
    default: draw_text(30, 0, "  СУББОТА  ", 1);
  }
}
void DS3231_display() {
  // Преобразовать в десятичную
  minute = (minute >> 4) * 10 + (minute & 0x0F);
  hour   = (hour >> 4)   * 10 + (hour & 0x0F);
  date   = (date >> 4)   * 10 + (date & 0x0F);
  month  = (month >> 4)  * 10 + (month & 0x0F);
  year   = (year >> 4)   * 10 + (year & 0x0F);
  Time[4]     = minute % 10 + 48;
  Time[3]     = minute / 10 + 48;
  if (second % 2)
    Time[2]   = 32;
  else
    Time[2]   = 58;
  Time[1]     = hour   % 10 + 48;
  Time[0]     = hour   / 10 + 48;
  Calendar[9] = year   % 10 + 48;
  Calendar[8] = year   / 10 + 48;
  Calendar[4] = month  % 10 + 48;
  Calendar[3] = month  / 10 + 48;
  Calendar[1] = date   % 10 + 48;
  Calendar[0] = date   / 10 + 48;
  if (temperature_msb < 0) {
    temperature_msb = abs(temperature_msb);
    temperature[0] = '-';
  }
  else
    temperature[0] = ' ';
  temperature_lsb >>= 6;
  temperature[2] = temperature_msb % 10  + 48;
  temperature[1] = temperature_msb / 10  + 48;
  if (temperature_lsb == 0 || temperature_lsb == 2) {
    temperature[5] = '0';
    if (temperature_lsb == 0) temperature[4] = '0';
    else                     temperature[4] = '5';
  }
  if (temperature_lsb == 1 || temperature_lsb == 3) {
    temperature[5] = '5';
    if (temperature_lsb == 1) temperature[4] = '2';
    else                     temperature[4] = '7';
  }
  draw_text(4,  12, Calendar, 2);                     // Показать дату (формат: дд / мм / гггг)
  draw_text(20, 30, Time, 3);                         // Показать время
  draw_text(80, 56, temperature, 1);                  // Показать температуру
}
void blink_parameter() {
  byte j = 0;
  while (j < 10 && digitalRead(button1) && digitalRead(button2)) {
    j++;
    delay(25);
  }
}
byte edit(byte x_pos, byte y_pos, byte parameter, byte text_size) {
  char text[3];
  sprintf(text, "%02u", parameter);
  while (!digitalRead(button1));                     // Подождите, пока кнопка B1 отпущена
  while (true) {
    while (!digitalRead(button2)) {                  // Если кнопка B2 нажата
      parameter++;
      if (i == 0 && parameter > 31)                  // Если date > 31 ==> date = 1
        parameter = 1;
      if (i == 1 && parameter > 12)                  // Если  month > 12 ==> month = 1
        parameter = 1;
      if (i == 2 && parameter > 99)                  // Если year > 99 ==> year = 0
        parameter = 0;
      if (i == 3 && parameter > 23)                  // Если hours > 23 ==> hours = 0
        parameter = 0;
      if (i == 4 && parameter > 59)                  // Если minutes > 59 ==> minutes = 0
        parameter = 0;
      sprintf(text, "%02u", parameter);
      draw_text(x_pos, y_pos, text, text_size);
      delay(200);                                    // Ждем 200ms
    }
    draw_text(x_pos, y_pos, "  ", text_size);
    blink_parameter();
    draw_text(x_pos, y_pos, text, text_size);
    blink_parameter();
    if (!digitalRead(button1)) {                     // Если кнопка B1 нажата
      i++;                                           // Увеличение «i» для следующего параметра
      return parameter;                              // Вернуть значение параметра и выйти
    }
  }
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(utf8rus(text));
  display.display();
}
void loop() {
  if (!digitalRead(button1)) {                       // Если кнопка B1 нажата
    i = 0;
    while (!digitalRead(button1));                   // Дождитесь отпускания кнопки B1
    while (true) {
      while (!digitalRead(button2)) {                // Пока кнопка B2 нажата
        day++;                                       // Инкремент для деня
        if (day > 7) day = 1;
        display_day();                               // Вызовите функцию display_day
        delay(200);                                  // Ждем 200 ms
      }
      draw_text(30, 0, "           ", 1);
      blink_parameter();                             // Вызов функции blink_parameter
      display_day();                                 // Вызовите функцию display_day
      blink_parameter();                             // Вызов функции blink_parameter
      if (!digitalRead(button1))                     // Если кнопка B1 нажата
        break;
    }
    date   = edit(4, 12, date, 2);                      // Изменить дату
    month  = edit(40, 12, month, 2);                    // Изменить month
    year   = edit(100, 12, year, 2);                    // Изменить year
    hour   = edit(20, 30, hour, 3);                     // Изменить hours
    minute = edit(74, 30, minute, 3);                   // Изменить minutes
    // Преобразовать десятичную в BCD
    minute = ((minute / 10) << 4) + (minute % 10);
    hour = ((hour / 10) << 4) + (hour % 10);
    date = ((date / 10) << 4) + (date % 10);
    month = ((month / 10) << 4) + (month % 10);
    year = ((year / 10) << 4) + (year % 10);
    // End conversion
    // Записать данные в DS3231 RTC
    Wire.beginTransmission(0x68);               // Запустите протокол I2C с адресом DS3231
    Wire.write(0);                              // Отправить адрес регистрации
    Wire.write(0);                              // Сбросьте sesonds и запустите генератор
    Wire.write(minute);                         // Запишем минуту
    Wire.write(hour);                           // Запишем  hour
    Wire.write(day);                            // Запишем  day
    Wire.write(date);                           // Запишем  date
    Wire.write(month);                          // Запишем  month
    Wire.write(year);                           // Запишем  year
    Wire.endTransmission();                     // Остановите передачу и отпустите шину I2C
    delay(200);                                 // Ждем 200ms
  }
  Wire.beginTransmission(0x68);                 // Запустите протокол I2C с адресом DS3231
  Wire.write(0);                                // Отправить адрес регистрации
  Wire.endTransmission(false);                  // Перезапуск I2C
  Wire.requestFrom(0x68, 7);                    // Запросите 7 байтов от DS3231 и освободите шину I2C
  second = Wire.read();                         // Считать секунды из регистра 0
  minute = Wire.read();                         // Считать minuts из регистра 1
  hour   = Wire.read();                         // Считать hour из регистра 2
  day    = Wire.read();                         // Считать day из регистра 3
  date   = Wire.read();                         // Считать date из регистра 4
  month  = Wire.read();                         // Считать month из регистра 5
  year   = Wire.read();                         // Считать year из регистра 6
  Wire.beginTransmission(0x68);                 // Запустите протокол I2C с адресом DS3231
  Wire.write(0x11);                             // Отправить адрес регистрации
  Wire.endTransmission(false);                  // Перезапуск I2C
  Wire.requestFrom(0x68, 2);                    // Запрос 2 байта от DS3231 и освобождение шины I2C
  temperature_msb = Wire.read();                // Чтение температуры MSB
  temperature_lsb = Wire.read();                // Считать температуру LSB
  display_day();
  DS3231_display();                             // Время и календарь
  delay(50);                                    // Ждем 50ms
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

Пишите в комментариях, какие проекты на данном дисплее вы бы хотели видеть.


Возможности OLED часов на arduino.

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

Возможности OLED часов на arduino.

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

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

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


На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока. До встречи в новом проекте.


]]>
Обзор USB адаптера (программатора) для ESP-01 на CH340G http://portal-pk.ru/news/241-obzor-usb-adaptera-programmatora-dlya-esp-01-na-ch340g.html Константин Portal-PK 2020-02-04T13:07:38+03:00 Сегодня я расскажу про USB адаптер для ESP-01 на чипе CH340G. И поделюсь своим опытом, как можно переделать данный адаптере в программатор для esp-01.

Описание адаптера для ESP-01.

Адаптер представляет из себя плату чёрного цвета, на которой установлены: микросхема CH340G; разъем с шагом 2,5 мм для установки модуля ESP-01; стабилизатор LM62063; USB разъем для подключения к компьютеру.

Описание адаптера для ESP-01.

Приобрел я на AliExpress USB адаптер для программирования esp-01. Из названия понятно, что это просто адаптер, а не программатор. В интернете достаточно много примеров переделки USB адаптера в программатор, что я и сделал, припаяв вот такую гребенку.

припаяв вот такую гребенку

Чтобы адаптер переходил в режим программирования необходимо GPIO0 замыкать на GND. А во втором положении перемычки, чтобы не замыкала данные контакты.

переделки USB адаптера в программатор

Это решение достаточно удобное. После прошивки микроконтроллера мы можем проверить какую информацию он вводит в монитор порта. Достаточно только поменять положение перемычки.

 поменять положение перемычки

Для работы адаптера на микросхеме CH340G необходимо установить дополнительный драйвер в операционной системе Windows. Драйвер можно скачать внизу статьи, в разделе материалы для скачивания. В операционной системе Linux всё работает без установки дополнительных драйверов.

Для проверки работоспособности программатора можно загрузить скетч мониторинга WiFi сетей

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

 загрузить скетч мониторинга WiFi сетей

Данный скетч есть в стандартных примерах Arduino IDE в разделе ESP8266WiFi, точнее он ставится вместе с установкой поддержки семейства ESP8266.

 Данный скетч есть в стандартных примерах Arduino IDE в разделе ESP8266WiFi, точнее он ставится вместе с установкой поддержки семейства ESP8266.

Как настроить Arduino IDE для работы с ESP8266

Как настроить Arduino IDE для работы с ESP8266 смотрите тут.

Для прошивки микроконтроллера esp-01 устанавливаем джампер так, чтобы он замыкал GPIO0 на GND. После прошивки переставляем джампер, что позволяет вывести информацию в монитор порта и мы увидим список доступных WiFi сетей.

 увидим список доступных WiFi сетей

Можно резюмировать, что данный метод переделки из USB адаптера в программатор работает. Но на этом история не заканчивается. Недавно нашел на AliExpress уже готовый программатор с переключателем на плате. Так выглядит данный программатор.

Недавно нашел на AliExpress уже готовый программатор с переключателем на плате

Он тоже сделан на микросхеме ch340g, и его принцип работы ничем не отличается от переделанного адаптера. А самое обидное то, что этот программатор стоит всего на 50-60 руб дороже, чем адаптер. Оставлю вам ссылку на программатор, чтобы вы не тратили лишнее время на переделку адаптера.

Надеюсь, что моя статья кому-нибудь помогла. Пишите своё мнение про адаптер, программатор и общее впечатление про ESP-01.

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

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

]]>
Cамодельный сенсорный светильник на Arduino (Digispark). http://portal-pk.ru/news/240-camodelnyi-sensornyi-svetilnik-na-arduino.html Константин Portal-PK 2020-01-30T11:22:11+03:00 На рынке достаточно много светильников с различными сенсорными кнопками . Что бы включить такой светильник необходимо прикоснуться к определённой области на корпусе прибора. Подобное управление я уже реализовывал, и меня не удивить таким управлением. Недавно делал елочную гирлянду, в которой управление сенсорной кнопкой выступало как альтернативное, основное управление реализовано по Wi-fi.

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

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

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

Теперь необходимо сделать основание корпуса, куда будет уложена электроника. Изначально я планировал начертить свое основание в программе Fusion 360, но на просторах интернета наткнулся вот на такой готовый вариант. Все элементы отлично подошли для моего проекта, пришлось только увеличить отверстие для установки разъёма 5,5 на 2,5 мм.

Теперь необходимо сделать основание корпуса,

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

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

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

- digispark

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

- разъем 5,5 на 2,5 мм

- алюминиевый профиль для светодиодных лент

- немного пластика для 3D принтера

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

Электронику светильника с сенсорным управлением на Arduino (Digispark) собираю вот по такой схеме.

Электронику светильника с сенсорным управлением на Arduino (Digispark) собираю вот по такой схеме.

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

У сенсорной кнопки ttp223

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

Укладываем электронику в основание и закрываем заднюю крышку.

Укладываем электронику в основание и закрываем заднюю крышку.


Переходим к программной части.

Чтобы Digispark работал в среде Arduino IDE необходимо настроить поддержку данной платы.

Для этого в Arduino IDE зайдём во вкладку «файл», «настройки» и в открывшемся окне настроек, в поле « Дополнительные ссылки для менеджера плат » указываем вот такую ссылку. Нажимаем кнопку « OK».

Для этого в Arduino IDE зайдём во вкладку

Дополнительные ссылки для менеджера плат

Дальше переходим в меню «инструменты», выбираем пункт «менеджер плат» и в открывшемся окне в строке поиска указываем слово: «Digispark». Производим установку.

Дальше переходим в меню «инструменты»

«Digispark». Производим установку.

После чего переходим в пункт меню «инструменты» и в пункте «платы» выбираем Digispark.

После чего переходим в пункт меню «инструменты» и в пункте «платы» выбираем Digispark.

Для операционной системы Windows необходимо установить дополнительные драйвера, которые вы можете скачать по ссылке или из раздела « материалы для скачивания» в конце статьи.

Прошивка Digispark немного отличается от прошивки Arduino.

Прошивка Digispark немного отличается от прошивки Arduino. Сперва нажимаем кнопку «загрузить», после чего появляется надпись о том, что ожидается подключение устройства. Далее мы подключаем к USB Digispark. Если вы увидели бегущие проценты до 100 и в конце надпись « Thank you!». Значит ваш плата успешно прошита.

 Далее мы подключаем к USB Digispark. Если вы увидели бегущие проценты до 100 и в конце надпись «Thank you!».


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

Код прошивки небольшой, максимум, что вам нужно изменить количество светодиодов в вашей ленте. Значение переменной STRIPSIZE как раз отвечает за установку количества светодиодов.

#include <Adafruit_NeoPixel.h>
#define PIN 0               // пин подключения ленты
#define STRIPSIZE 20        // количество светодиодов в ленте
byte button_rejim = 1;      // кнопка режим
byte rejim = 0;             // текущий режим
byte yarkast = 150;         // текущая яркасть 
boolean lastButten = LOW;   // предыдущее состояние кнопки
boolean currentButten = LOW;// текущее состояние кнопки

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

С остальным, я думаю, можно разобраться, тут ничего сложного нет.

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

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

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

Используя режимы радуги и смены цветов, светильник можно использовать как ночник .

Используя режимы радуги и смены цветов, светильник можно использовать как ночник .

Планирую доработать данную версию светильника. Есть идея сделать управление через Bluetooth, wi-fi с помощью мобильного приложения. Пишите в комментариях, и на форуме какую версию проекта вы бы хотели видеть. И что вас интересует, возможно даже не в рамках данного проекта.

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

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Урок 16.1. Бегущая строка на русском языке. Arduino и MAX7221. http://portal-pk.ru/news/239-begushchaya-stroka-na-russkom-yazyke-arduino-i-max7221.html Константин Portal-PK 2020-01-28T12:40:35+03:00 Сегодня в уроке научимся выводить текст на русском языке на матрицу MAX7221. Для более быстрой смены текста в бегущей строке «научим» Arduino выводить на матрицу полученный текст из монитора порта . Как подключать матрицу MAX7221 к Arduino, рассказывал в предыдущем уроке: Подключаемматрицу Max72xx (MAX7219) к Arduino. Простая анимация.

Подключение светодиодной матрицы 8×8 на MAX7219 к Arduino.

Для выполнения Arduino урока нам понадобится:

Для подключения необходимо пять проводов, которые чаше всего идут в комплекте с матрицей. Подключаем вывод CLK (MAX7219 ) к выводу 13 (Arduino), вывод CS подключаем к выводу 9, вывод DIN подключаем к выводу 11. Питание подключается VCC к +5В и GND к GND.

Схема подключения модуля с 4 матрицами к Arduino UNO .

Схема подключения модуля с 4 матрицами к Arduino UNO.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO будет вот такой.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO
Установка библиотек Adafruit_GFX и Max72xxPanel. И настройка для вывода русского текста.

Существует несколько библиотек, доступных для управления матрицей на драйвере MAX7219 . В этом уроке я буду использовать две библиотеки: Adafruit_GFX и Max72xxPanel .

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками .

Должен открыться менеджер библиотек.

2. Укажите “ GFX” в поле поиска, выберете из списка и установите библиотеку от Adafruit GFX.

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

3. Библиотеку Max72xxPanel можно установить из zip архива. Для этого скачайте архив с библиотекой отсюда или внизу урока из раздела «Файлы для скачивания». В Arduino IDE перейдите в раздел Скетч > Подключить библиотеку > Добавить .ZIP библиотеку . Выбираете архив с библиотекой.

 Библиотеку Max72xxPanel можно установить из zip архива

4. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться. Вы также можете скачать библиотеку Adafruit-GFX подготовленную для работы с русским текстом внизу статье есть раздел с материалами для урока.

5. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

6. После установки библиотек перезагрузите среду разработки Arduino.


Пример вывода русского текста на матрицу MAX7221.

Пример вывода русского текста на матрицу MAX7221.

Пример 1. Выводим русский текст на матрицу. Текст хранится в переменной. Для смены текста нужно постоянно загружать скетч в Arduino.

В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 100;                             // интервал, чем меньше тем бытрее бежит строка
int spacer = 1;                             // Промежуток между символами (кол-во точек)
int width = 5 + spacer;                     // Ширина шрифта составляет 5 пикселей

void setup() {
  Serial.begin(9600);
  tape = utf8rus("Привет мир! Портал ПК");
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                     // Направление текста 1,2,3,4
}

void loop() {

  for ( int i = 0 ; i < width * tape.length() + matrix.width() - spacer; i++ )
  {
    matrix.fillScreen(LOW);

    int letter = i / width;                   // номер символа выводимого на матрицу

    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;         // отцентрировать текст по вертикали

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();                       // выведим значения на матрицу
    delay(wait);
  }
}

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

При выводе русского текста использовать функцию utf8rus() .

Как видно, вывод на матрицу не сильно отличается от вывода русского текста на SSD1306 OLED-диспл ей: SSD1306OLED-дисплей, вывод текста на русскомязыке в Arduino IDE


Пример 2. Выводим на матрицу русский текст, полученный из монитора порта.

Выводим на матрицу русский текст, полученный из монитора порта.

За основу возьмем первый пример. Добавим в него функцию, которая посимвольно считывает значения с монитора порта. Сохраним полученный результат в переменную для вывода значения на MAX7221. А остальная часть кода остается без изменений.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
String tape = "";
int wait = 100;                             // интервал, чем меньше тем бытрее бежит строка
int spacer = 1;                             // Промежуток между символами (кол-во точек)
int width = 5 + spacer;                     // Ширина шрифта составляет 5 пикселей
void setup() {
  Serial.begin(9600);
  tape = utf8rus("Привет мир! Портал ПК");
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                     // Направление текста 1,2,3,4
}
void loop() {
  if (Serial.available()) {                  // получили данные
    tape = utf8rus(Serial_Read());           // Считываем и сохроняе в переменную
  }
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - spacer; i++ )
  {
    matrix.fillScreen(LOW);
    int letter = i / width;                   // номер символа выводимого на матрицу
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;         // отцентрировать текст по вертикали
    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();                       // выведим значения на матрицу
    delay(wait);
  }
}
String Serial_Read() {
  unsigned char c;                        // переменная для чтения сериал порта
  String Serial_string = "";              // Формируемая из символов строка
  while (Serial.available() > 0) {        // Если в сериал порту есть символы
    c = Serial.read();                    // Читаем символ
    if (c == '\n') {                      // Если это конец строки
      return Serial_string;               // Возвращаем строку
    }
    Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
  }
  return Serial_string;
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

После чего нужно нажать кнопку « Отправить». Вот, что получается.

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

Один минус. Пока не закончится показ предыдущего текста, новый не будет выводиться на матрицу. Это особенности работы матрицы MAX7221.

Матрицу можно сделать гораздо больше , и на нее выводить текст с анимацией из предыдущего урока. Пишите в комментарии, какой проект на Arduino вы бы хотели увидеть с использованием матриц MAX7221 и Arduino.

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Вездеход на гусеницах с радиоуправлением http://portal-pk.ru/news/238-vezdehod-na-gusenicah-s-radioupravleniem.html Константин Portal-PK 2020-01-18T18:26:24+03:00 На подарок купил ребенку конструктор вездеход на гусеницах с радиоуправлением . Ребенок давно хотел радиоуправляемую машинку или танк на гусеничном ходу . А тут еще и конструктор, который можно собрать самому.


Комплектация конструктора с радиоуправлением.

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

 отвертка, которая нужна только для установки батареек в пульт; зарядное устройство, которое подключается к зарядке телефона.

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

Все детали разделены по пакетикам

В комплекте идет достаточно подробная инструкция. На последней странице есть список всех элементов конструктора.

список всех элементов конструктора

На первой странице список пронумерованных пакетов с деталями. А также QR код для установки приложения на телефон с OS Android или ISO.

 На первой странице список пронумерованных пакетов с деталями. А также QR код

Мне еще понравилось то, что для всех деталей прописана длина в сантиметрах, а часть приведена в натуральную величину. Можно просто приложить и понять, подходит деталь сюда или нет. Удобно для детей, которые плохо считаю.

Сборка машинки на гусеничном ходу.

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

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

Устанавливаем основные элементы на основание машинки. Дальше делается корпус машины.

Устанавливаем основные элементы на основание машинки.

И в конце собираются гусеницы, и устанавливаются на машину.

И в конце собираются гусеницы, и устанавливаются на машину.

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

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

Модель достаточно больших размеров.


Установка и использование приложения для управления вездеходом

Для установки приложения нужно сканировать QR код, который находится на первой странице инструкции. Приложение есть для устройств на OS Android и ISO .

Для установки приложения нужно сканировать QR код

При установке приложения на OS Android возникла проблема. Браузер блокирует загрузку приложения. Возможно, есть настройки для устранения данного досадного казуса, но я решил данную ситуацию установкой другого браузера uc browser. После чего приложение скачалось и установилось без проблем. Конечно, пришлось подтвердить, что разрешаю установить приложение, разрешить доступ к фото и пр. функциям.


После установки приложения надо выбрать модель базы, в моем случае это модель 3,0 серии.

После установки приложения надо выбрать модель базы, в моем случае это модель 3,0 серии.

Из списка радиоуправляемых конструкторов, выбираем наш.

Из списка радиоуправляемых конструкторов, выбираем наш.

Нужная для меня модель находиться на 3 странице.

Нужная для меня модель находиться на 3 странице.

После выбора модели в открывшемся меню нажимаем на джойстик.

После выбора модели в открывшемся меню нажимаем на джойстик.

Откроется страница управления в виде джойстика.

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

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

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

Еще одна интересная функция - это управление наклоном телефона.

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

В приложении есть функция управления по метке

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


С какими сложностями и неудобствами вы можете столкнуться:

1. Еще раз повторюсь. Приложение для управления вездеходом с телефона не скачивается стандартными браузерами с настройками по умолчанию. Для решения этой проблемы можно установить браузер uc browser . Данная проблема актуальна для устройств с операционной системой OS Android . Как обстоят дела с ISO, не проверял.

2. Машинка не соединяется попеременно с пультом и с приложением. Тут может быть несколько причин. Самая банальная заключается в том, что машина не может одновременно подключаться и к пульту и к приложению. Если вы подключены к машине с пульта и решили подключиться с приложения, то нужно сперва выключить пульт и перезагрузить машину, после чего можно подключиться и управлять с приложения. И аналогична обратная ситуация. Если вы управляли с приложения, то нужно отключить приложение и перезагрузить машинку, и после чего подключиться с пульта. Неудобно. Но так устроена работа радиопередачи, нельзя подключиться одновременно по двум каналам. А если дать такую возможность, то как управлять? И получится как в басне И. А. Крылов: «Лебедь, Щука и Рак».

Машинка не соединяется попеременно с пультом и с приложением.

Вывод.

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

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

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
#16. Подключаем матрицу Max72xx (MAX7219) к Arduino. Простая анимация. http://portal-pk.ru/news/237-podklyuchaem-matricu-max72xx-max7219-k-arduino-prostaya-animaciya.html Константин Portal-PK 2020-01-13T08:44:48+03:00

Сегодня в уроке покажу как подключить к Arduino светодиодную матрицу на MAX7219. Матрица состоит из 8 рядов и 8 столбцов, всего 64 светодиода, которыми управляет драйвер MAX7219 . В этом Arduino уроке буду использовать модуль из 4 матриц на базе драйвера MAX7219 , но это все те же матрицы, просто установлены в модуль с 4 драйверами. В дальнейшем буду подключать и 16, и 32, и, возможно, 64 матрицы. А пока, в рамках данного урока, научу управлять 1 матрицей и поиграю с 4 матрицами данного модуля.

 В этом Arduino уроке буду использовать модуль из 4 матриц на базе драйвера MAX7219

Технические параметры матрицы 8х8.

  • Драйвер: MAX7219;
  • Количество светодиодов на индикаторе 1088BS: 64;
  • Тип индикаторов 1088BS: общий катод;
  • Цвет светодиодов: красный;
  • Диаметр одного светодиода: 3 мм;
  • Интерфейс подключения матрицы: SPI;
  • Напряжение питания: 5 В;
  • Размер матрицы: 32 х 32 х 14 мм;

Как устроена матрица 8х8

Как указывалось ранее, эта матрица имеет 8 столбцов и 8 строк. Каждый светодиод индексируется от 0 до 7. Вот рисунок для лучшего понимания:

Технические параметры матрицы 8х8 на базе драйвера MAX7219

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

Например, если вы хотите отобразить смайлик, вот что вам нужно сделать:

Например, если вы хотите отобразить смайлик, на матрицу MAX7219

Подключение светодиодной матрицы 8×8 на MAX7219 к Arduino.

Для выполнения Arduino урока нам понадобится :

Для подключения необходимо пять проводов, которые чаше всего идут в комплекте с матрицей. Подключаем вывод CLK (MAX7219 ) к выводу 13 (Arduino), вывод CS подключаем к выводу 9, вывод DIN подключаем к выводу 11. Питание подключается VCC к +5В и GND к GND.

Подключение матрицы MAX7219 к Arduino

Подключение матрицы MAX7219 к Arduino NANO аналогично.

Подключение матрицы MAX7219 к Arduino NANO

Схема подключения модуля с 4 матрицами ни чем не отличается. Все подключается к тем же пинам Arduino UNO .

Схема подключения модуля с 4 матрицами

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO будет вот такой.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO

Установка библиотек Adafruit_GFX и Max72xxPanel.

Существует несколько библиотек, доступных для управления матрицей на драйвере MAX7219. В этом уроке я буду использовать две библиотеки: Adafruit_GFX и Max72xxPanel.

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками .

Должен открыться менеджер библиотек.

2. Укажите “ GFX” в поле поиска, выберете из списка и установите библиотеку от Adafruit GFX.

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

3. Библиотеку Max72xxPanel можно установить из zip архива. Для этого скачайте архив с библиотекой отсюда или внизу урока из раздела «Файлы для скачивания». В Arduino IDE перейдите в раздел Скетч > Подключить библиотеку > Добавить . ZIP библиотеку. Выбираете архив с библиотекой.

 Библиотеку Max72xxPanel можно установить из zip архива

4. После установки библиотеки перезагрузите среду разработки Arduino.


Примеры кода работы с матрицей MAX7219

Пример 1. Вывод двух точек на матрицу MAX7219 в среде Arduino IDE.

Вывод двух точек на матрицу MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.drawPixel(3, 3, HIGH);            // Включаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, HIGH);            // Включаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(3, 3, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
}

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

Пример 2 . Построчное заполнение матрицы MAX7219.

Построчное заполнение матрицы MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  for (int y = 0; y < 8; y++ ) {
    for (int x = 0; x < 32; x++ ) { // Передача массива
      matrix.drawPixel(x, y, HIGH);
      matrix.write();
      delay(200);
    }
  }
}


Пример 3 . Вывод линий по диагонали матрицы MAX7219.

Вывод линий по диагонали матрицы MAX7219 в среде Arduino IDE.

Используя предыдущий пример немного изменю код. Предлагаю не заполнять построчно, а сделать перемещение по оси Y на 1, при каждом перемещении на 1 по оси X, до тех пор, пока не спуститесь до последнего пикселя матрицы.После чего начните заново выводить линию сверху матрицы. Можно таким же образом выводить зигзаг, изменить данный пример для данной цели не составит большого труда.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
    for (int x = 0; x < 32; x++ ) { // Передача массива
      matrix.drawPixel(x, y, HIGH);
      matrix.write();
      delay(200);
      y++;
      if (y>=8)
        y=0;
    }
}

Пример 4 . Рисуем квадрат по контуру матрицы MAX7219.


Рисуем квадрат по контуру матрицы MAX7219 в среде Arduino IDE.

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

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  y = 0;
  for (int x = 0; x < 32; x++ ) { // Передача массива
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // Передача массива
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  y = 0;
  for (int x = 0; x < 32; x++ ) { // Передача массива
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // Передача массива
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
}

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


Пример 5 . Мигающий прямоугольник контура матрицы MAX7219.

Мигающий прямоугольник контура матрицы MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  delay(500);
  y = 0;
  for (int x = 0; x < 32; x++ ) { // 
    matrix.drawPixel(x, y, HIGH);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, HIGH);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // 
    matrix.drawPixel(x, y, HIGH);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, HIGH);
  }
  matrix.write();
  delay(500);
}

Пример 6 . Вывод графических элементов на MAX7219 в среде Arduino IDE.

Вывод графических элементов на MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  const byte hf[8] = {                    // Создаем массив "Смайл"
    0b00111100,                               //    ####
    0b01000010,                               //   #    #
    0b10100101,                               //  # #  # #
    0b10000001,                               //  #      #
    0b10100101,                               //  # #  # #
    0b10011001,                               //  #  ##  #
    0b01000010,                               //   #    #
    0b00111100                                //    ####
  };                                          
  byte nf[8] = {B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100};
  byte sf[8] = {B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100};
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, hf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, nf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, sf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
}

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

Для того чтобы выводить графические элементы на матрицу можно написать макрос для Excel или воспользоваться программой. При написании данного урока случайно нашел вот такую программу PixelToMatrix, которая облегчает рисование на матрице 8х8.

 программу PixelToMatrix

Скачать программу можно внизу урока из раздела « Файлы для скачивания»

Итоги урока.

Как видно из примеров, выводить информацию на матрицу достаточно просто. В следующем уроке покажу как выводит текст на Русском языке на MAX7219 в среде Arduino IDE .

 как выводит текст на Русском языке на MAX7219 в среде Arduino IDE

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


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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Виды направляющих для станков с ЧПУ. http://portal-pk.ru/news/236-vidy-napravlyayushchih-i-podshipnikov-dlya-stankov-s-chpu.html Константин Portal-PK 2019-12-26T12:05:02+03:00 На протяжении нескольких лет мое хобби - это создание проектов на Arduino. В том числе разработка станков с ЧПУ на базе Arduino. Сделал я уже несколько видов ЧПУ станков, от лазерного гравировального, до фрезерного станка с ЧПУ. Также модернизировал свой 3D принтер Anet A8.

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


Направляющие полированный вал.

Самый распространенный вид направляющих для небольших станков и 3D принтеров.

Направляющие полированный вал.

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

Минус данных направляющих заключается в провисании при использовании длинных направляющих, так как нет дополнительной опоры, только крепление в 2-х точках.

шариковые втулки

Для этих направляющих используют шариковые втулки. Данные подшипники не рассчитаны для работы под большим весом. Это второй фактор, который указывает на использование таких направляющих для небольших станков.


Шлицевой вал.

Шлицевой вал.

Этот вид направляющих валов отличаются только шлицами (пазами) по длине вала. Данная конструкция валов имеет меньший люфт по сравнению с полированными валами, но при этом значительно дороже, и поэтому применяется реже.


Направляющая вал на опоре.

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

Направляющая вал на опоре

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

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


Шариковые профильные рельсовые направляющие.

Благодаря дорожкам качения нагрузка распределяется, что значительно снижает люфт и увеличивает грузоподъемность и износоустойчивость.

Шариковые профильные рельсовые направляющие.

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

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

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

Роликовые профильные направляющие.

Роликовые направляющие являются одним из подвидов рельсовых направляющих. Их отличие в том, что в каретке добавлены ролики и, соответственно, профиль направляющей сделан так, что в нем есть паз под ролики.

Роликовые профильные направляющие.

Это увеличивает грузоподъемность и износоустойчивость.

Роликовые профильные направляющие применяются в станках для обработки черных металлов, камня и стали.


Направляющие ласточкин хвост.

Это увеличивает грузоподъемность и износоустойчивость.

Направляющие типа «ласточкин хвост» являться достаточно точными и применяются в металлообрабатывающих станках, но в связи со сложностью их ремонта и замены используются редко.


Роликовые каретки (ролики) для алюминиевого профиля.

Роликовые каретки (ролики) для алюминиевого профиля.

Для 3D принтеров и для лазерных станков очень распространены роликовые каретки, которые перемещаются по алюминиевому профилю, который в свою очередь выступает рамой станка. Очень экономичное и достаточно эффективное решение.

Ролики бывают пластиковые и нейлоновые.

Профиль для ЧПУ (CNC) - экструзионный, он же станочный, он же openbuilds профиль. Бывает T-slot и V-slot.

Для роликовых направляющих нужно покупать профиль V-slot. Это важную мелочь упускают начинающие разработчики ЧПУ станков.

Профиль для ЧПУ (CNC) - экструзионный, он же станочный, он же openbuilds профиль. Бывает T-slot и V-slot.

Это еще не все виды направляющих для ЧПУ станков. Свои варианты и предложения пишите в комментариях.


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

Всем Пока-Пока.

И до встречи в следующей статье.

]]>
Елочная смарт-гирлянда с управлением через мобильное приложение. http://portal-pk.ru/news/235-elochnaya-smart-girlyanda-s-upravleniem-cherez-mobilnoe.html Константин Portal-PK 2019-12-12T13:36:27+03:00 Привет всем. Сегодня расскажу про вторю версию новогодней гирлянды . Управлять данной смарт-гирляндой можно с телефонного приложения , или с помощью сенсорной кнопки .

Версия 2020 с поддержкой ESP32.

Интерфейс приложения вот такой:

Интерфейс приложения вот такой

Гирлянда со звездой выглядит вот так:

Гирлянда со звездой выглядит

Основные возможности самодельной смарт-гирлянды:

1. 15 световых эффектов.

2. Возможность изменить набор режимов из предустановленных 55, которые устанавливаются с библиотекой WS2812FX. Достаточно выбрать номер режима и нужный эффект. Список доступных эффектов будет ниже.

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

4. Настройка скорости эффектов.

5. Настройка яркости.

6. Управление сенсорной кнопкой: переключение режимов и изменение яркости.

7. Выбор цвета по умолчанию. Некоторые режимы используют один цвет, этот цвет и можно изменить. Палитра из 6 цветов.

Более подробное описание программы и приложения читайте ниже.

Для обсуждения сделал темуна форуме. Ваше мнение и предложения помогут улучить гирлянду, возможно, это будет что-то больше, чем Новогодняя смарт-гирлянда.


Первая версия новогодней гирлянды с управлением со смартфона.

В прошлом году, перед самым новым годом, спаял из адресных светодиодов новогоднюю гирлянду .

В прошлом году, перед самым новым годом, спаял из адресных светодиодов новогоднюю гирлянду.

И сделал простое приложение для управления.

 простое приложение для управления

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


Доработка гирлянды.

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

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

Звезда на елке у меня уже 2, или даже 3 года, покупал в Фикс прайсе .

Звезда на елке у меня уже 2, или даже 3 года, покупал в Фикс прайсе.

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

спаял 5 адресных светодиодов WS2812, установил по светодиоду на каждый луч звезды.

Вот, что получилось. Светит звезда достаточно ярко .

Светит звезда достаточно ярко

Правда мне сказали, что не хватает еще одного светодиода в центре звезды. Если успею, то добавлю и его.


Доработка электроники

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

Поэтому решил в этом году все спрятать в белую коробку.

Поэтому решил в этом году все спрятать в белую коробку. Благо NodeMCU помещается в данную коробку с точностью до миллиметра. Сделал разъем 5,5 мм для подключения питания. Кроме этого, решил установить кнопку с фиксацией для включения гирлянды, и сенсорную кнопку для переключения режимов.

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

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

Собрал все вот по такой схеме.

Собрал все вот по такой схеме.

Android приложение для управления смарт-гирляндой .

Приложение для Android переписал полностью. Также как и в первом варианте есть 2 страницы.

Основная, на которой производим управление светодиодами. И Страница настроек.

Настройки.

Первое, что нам нужно, - это установить ip адрес нашей гирлянды . Как его узнать расскажу в описании прошивки.

 ip адрес нашей гирлянды

Также у нас есть выбор режимов для гирлянды.

Также у нас есть выбор режимов для гирлянды.

Выбираем номер режима и в поле «Название эффекта» покажет какой эффект у вас установлен.

Пишем номер эффекта от 1 до 55 и нажимаем на круглую кнопку со стрелками. После чего название эффекта должно смениться на новое.

И так можно изменить все 15 режимов. Количество режимов можно увеличить или уменьшить. Это делается в прошивке в среде Arduino IDE .

Список доступных эффектов. На английском.

1. Blink - Normal blinking. 50% on/off time.
2. Breath - Does the "standby-breathing" of well known i-Devices. Fixed Speed.
3. Color Wipe - Lights all LEDs after each other up. Then turns them in that order off. Repeat.
4. Color Wipe Inverse - Same as Color Wipe, except swaps on/off colors.
5. Color Wipe Reverse - Lights all LEDs after each other up. Then turns them in reverse order off. Repeat.
6. Color Wipe Reverse Inverse - Same as Color Wipe Reverse, except swaps on/off colors.
7. Color Wipe Random - Turns all LEDs after each other to a random color. Then starts over with another color.
8. Random Color - Lights all LEDs in one random color up. Then switches them to the next random color.
9. Single Dynamic - Lights every LED in a random color. Changes one random LED after the other to a random color.
10. Multi Dynamic - Lights every LED in a random color. Changes all LED at the same time to new random colors.
11. Rainbow - Cycles all LEDs at once through a rainbow.
12. Rainbow Cycle - Cycles a rainbow over the entire string of LEDs.
13. Scan - Runs a single pixel back and forth.
14. Dual Scan - Runs two pixel back and forth in opposite directions.
15. Fade - Fades the LEDs on and (almost) off again.
16. Theater Chase - Theatre-style crawling lights. Inspired by the Adafruit examples.
17. Theater Chase Rainbow - Theatre-style crawling lights with rainbow effect. Inspired by the Adafruit examples.
18. Running Lights - Running lights effect with smooth sine transition.
19. Twinkle - Blink several LEDs on, reset, repeat.
20. Twinkle Random - Blink several LEDs in random colors on, reset, repeat.
21. Twinkle Fade - Blink several LEDs on, fading out.
22. Twinkle Fade Random - Blink several LEDs in random colors on, fading out.
23. Sparkle - Blinks one LED at a time.
24. Flash Sparkle - Lights all LEDs in the selected color. Flashes single white pixels randomly.
25. Hyper Sparkle - Like flash sparkle. With more flash.
26. Strobe - Classic Strobe effect.
27. Strobe Rainbow - Classic Strobe effect. Cycling through the rainbow.
28. Multi Strobe - Strobe effect with different strobe count and pause, controlled by speed setting.
29. Blink Rainbow - Classic Blink effect. Cycling through the rainbow.
30. Chase White - Color running on white.
31. Chase Color - White running on color.
32. Chase Random - White running followed by random color.
33. Chase Rainbow - White running on rainbow.
34. Chase Flash - White flashes running on color.
35. Chase Flash Random - White flashes running, followed by random color.
36. Chase Rainbow White - Rainbow running on white.
37. Chase Blackout - Black running on color.
38. Chase Blackout Rainbow - Black running on rainbow.
39. Color Sweep Random - Random color introduced alternating from start and end of strip.
40. Running Color - Alternating color/white pixels running.
41. Running Red Blue - Alternating red/blue pixels running.
42. Running Random - Random colored pixels running.
43. Larson Scanner - K.I.T.T.
44. Comet - Firing comets from one end.
45.Fireworks - Firework sparks.
46. Fireworks Random - Random colored firework sparks.
47. Merry Christmas - Alternating green/red pixels running.
48. Fire Flicker - Fire flickering effect. Like in harsh wind.
49. Fire Flicker (soft) - Fire flickering effect. Runs slower/softer.
50. Fire Flicker (intense) - Fire flickering effect. More range of color.
51. Circus Combustus - Alternating white/red/black pixels running.
52. Halloween - Alternating orange/purple pixels running.
53. Bicolor Chase - Two LEDs running on a background color (set three colors).
54. Tricolor Chase - Alternating three color pixels running (set three colors).
55. ICU - Two eyes looking around.

Номер и название выводиться при выборе эффекта для режима.

Номер и название выводиться при выборе эффекта для режима.

Если кто-то готов помочь с переводом режимов, буду благодарен.


Основная страница.

Тут, я думаю, все понятно. Стрелочки влево и вправо это выбор режима. Переключатель «Авто» включает или выключает Авто режим.

Переключатель «Авто» включает или выключает Авто режим.

Верхний бегунок - настройка яркости. Второй бегунок - настройка скорости эффектов.

«Цвет по умолчанию» — это выбор цвета для режимов, где используется один цвет.

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


Скетч для NodeMCU

Для того, чтобы загрузить прошивку в NodeMCU Необходимо:

1. Установить Arduino IDE. Как это сделать читайте тут: Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino

2. Настроить Arduino IDE для работы с NodeMCU: Что такое NodeMCU? Программируем в среде Arduino IDE

3. Установить библиотеки: WS2812FX, ESP_EEPROM. Скачать их можно внизу страницы, там же и все исходники.

4. Скачать прошивку, архивы внизу страницы, настроить все необходимые параметры.

Для подключения к вашей Wi-Fi сети нужно заполнить поля:

    String _ssid     = "Wi-Fi"; // Для хранения SSID
    String _password = "1234567"; // Для хранения пароля сети

Указав логин и пароль от вашей Wi-Fi сети.

Если эти поля не заполнять, то NodeMCU поднимет точку доступа с параметрами:

    IPAddress apIP(192, 168, 4, 1);
    String _ssidAP = "PortalPKGarland";   // SSID AP точки доступа
    String _passwordAP = "012345"; // пароль точки доступа

То есть в списке wi-fi сетей появится сеть " PortalPKGarland". Пароль для подключения к которой будет "012345". В таком случае в приложении нужно указать вот такой IP адрес: «192.168.4.1».

Как узнать ip если мы подключились к действующей wi-fi сети?

Для этого откройте монитор порта в Arduino IDE.

монитор порта в Arduino IDE.

И нажмите на кнопку RST на плате NodeMCU. На монитор порта выйдет информация.

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

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

Устанавливайте приложения и пользуйтесь.

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


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

Скоро будет продолжение. не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#15.2 Дисплей SSD1306. Вывод растрового изображения. http://portal-pk.ru/news/234-displei-ssd1306-vyvod-rastrovogo-izobrazheniya-na-ekrane.html Константин Portal-PK 2019-12-03T11:58:55+03:00 На OLED-дисплее SSD1306 можно отображать одноцветные растровые изображения размером 128×64 пикселя.

Первое, что нужно сделать, это изменить размер фотографии или изображения, и сохранить его в виде монохромного растрового изображения. Если вы находитесь на ПК с Windows, вы можете использовать Paint.

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

изображение водяного знака для сайта

свою фотографию

Как сделать свое изображение.

В сети есть множество инструментов для преобразования изображений в массив байт. Какие-то из них необходимо устанавливать, есть даже те, что работают онлайн. Кстати, такой формат изображений называется X-Bitmap. Я же буду использовать бесплатную программу LCD Image Converter. Данная программа умеет конвертировать картинки в массив данных для вывода изображений на дисплей, например на OLED-дисплей SSD1306. Программа из коробки имеет русский язык , достаточно его выбрать по умолчанию.

бесплатную программу LCDImage Converter

Затем в программе LCD Image Converter выберете «Новое изображение».

Затем в программе LCD Image Converter выберете «Новое изображение».

В открывшемся окне укажите имя, я оставил по умолчанию.

В открывшемся окне укажите имя, я оставил по умолчанию.

Для загрузки изображения нажимаем Изображение → Импортировать .

Для загрузки изображения нажимаем Изображение

Вот так выглядит моя фотография до конвертирования. Нажимаем «Преобразование»

Вот так выглядит моя фотография до конвертирования

Здесь вам нужно произвести настройки программы LCD Image Converter, как показано на картинке ниже.

Здесь вам нужно произвести настройки программы LCD Image Converter

настройки программы LCD Image Converter

Также измените параметры на вкладке «Изображения»

Также измените параметры на вкладке «Изображения»

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

преобразовать ваше изображение для вывода на дисплей для Arduino проектов.

Укажите имя файла и тип файла «.с» и сохраните файл.

Укажите имя файла и тип файла «.с» и сохраните файл.


Код Arduino для вывода растрового изображения на SSD1306 дисплей.

Файл, который вы получили содержит массив «C» с изображением. Откройте этот файл в текстовом редакторе и скопируйте массив.

static const uint8_t image_data_Image[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};

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

Код в среде Arduino IDE будет выглядит вот так.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
static const uint8_t image_data_Image[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
  // Clear the buffer.
  display.clearDisplay();
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, image_data_Image3, 128, 64, 1);
  display.display();
}
void loop() { 
}

Но работать он будет только на NodeMCU.

Но работать он будет только на NodeMCU.

Arduino, даже семейство MEGA, не сможет отобразить ваше изображение. Это связано с тем, что нужно добавить PROGMEM, которая дает понять компилятору, что данную переменную необходимо хранить во flash памяти, а не в SRAM. Подробнее про PROGMEM можете прочитать тут.

У нас было:

static const uint8_t image_data_Image[1024]

Должно быть вот так:

static const PROGMEM uint8_t image_data_Image[1024]

Код вывода растровых изображений на дисплей SSD1306 для Arduino будет вот таким.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

static const PROGMEM uint8_t image_data_Image3[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};
 
void setup() {
  Serial.begin(115200);
 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
 
  // Clear the buffer.
  display.clearDisplay();
  
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, image_data_Image3, 128, 64, 1);
  display.display();
}
 
void loop() {
  
}

Загрузите в Arduino NANO и получите результат.

Загрузите в Arduino NANO и получите результат.

Есть одно небольшое «но». Если вы уменьшите растровое изображение, редактор может черные линии немного осветить, и при конвертировании эти линии заполняться частично точками. Так как дисплей выводит или нет точки, и серый пытается компенсировать меньшей плотностью точек. Редактор изменить яркости точек не умеет, и может получиться вот так.

Если вы уменьшите растровое изображение

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

Подправил я картинку, и вот что получилось.

GIMP может конвертировать изображения с расширением .xbm

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


На этом цикл уроков по дисплею SSD1306 заканчиваю. Если есть вопросы и предложения по урокам, пишите в комментариях .

Предыдущие уроки по дисплею SSD1306:

#15Дисплей SSD1306 подключаем к Arduino. Выводимтекст, рисуем фигуры.

#15.1SSD1306 OLED-дисплей, вывод текста на русскомязыке в Arduino IDE

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#15.1 SSD1306 OLED-дисплей, вывод текста на русском языке в Arduino IDE http://portal-pk.ru/news/233-ssd1306-oled-displei-vyvod-teksta-na-russkom-yazyke-v-arduino-ide.html Константин Portal-PK 2019-11-28T09:03:55+03:00 Как и обещал в предыдущем уроке ДисплейSSD1306 подключаем к Arduino. Выводим текст,рисуем фигуры. расскажу, как вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE.

 вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE

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

1. Установить библиотеки Adafruit : библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX . Как их установить, я рассматривал в предыдущем уроке.

2. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться.

3. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

4. Добавить в блок void setup() {} следующую строчку кода.

display.cp437(true);

5. При выводе русского текста использовать функцию utf8rus().

За основу возьмите скетч из урока 15. вывод “Hello, world!” на OLED-дисплей .

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

display.println("Hello,world!");

на

display.println(utf8rus("Привет МИР!"));

В итоге. у вас должен получится код:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,20);             
  display.println(utf8rus("Привет МИР!"));
  display.display();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Вы уже умеете работать с выводом теста на дисплей

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

изменить размер текста и расположить по центру дисплея

Скетч данного примера будет вот таким.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(27, 0);
  // Display static text
  display.setTextSize(2); // Draw 2X-scale text
  display.println(utf8rus("Привет"));
    display.setCursor(32, 30);
  // Display static text
  display.setTextSize(3); // Draw 3X-scale text
  display.println(utf8rus("МИР!"));
  display.display(); 
}
void loop() {
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Ниже скетч вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE :

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,0);             
  display.println(utf8rus("АБВГДЕЖЗИЙКЛМНОП"));
  display.println(utf8rus("РСТУФХЦЧШЩЪЫЬЭЮЯ"));
  display.println(utf8rus("абвгдежзийклмноп"));
  display.println(utf8rus("рстуфхцчшщъыьэюя"));
  display.println(utf8rus("Ёё123ABCabc!@#\xBC\xBD"));
  display.println(utf8rus("10\x83 10\x8A\x82 10\x81\x80 2\x85"));
  display.display();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE

И напоследок, вот такой пример вывода спец символов букв и цифр , найден на просторах интернета.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
unsigned char i1,i2,c3;
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
}
void loop() {
  TEST_display_1();
  delay(10000);
  TEST_display_2();
  delay(10000);
  TEST_display_3();
  delay(8000);
  TEST_display_4();
  delay(4000);
}
void TEST_display_1()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=0; i1<8; i1++) {
    for(i2=0; i2<16; i2++) {
      c3=i1*16+i2;
      if(c3 == 0x0A || c3 == 0x0D) display.print(" ");
      else display.write(c3);
    }
    display.println("");
  }
  display.display();
}
void TEST_display_2()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=8; i1<16; i1++) {
    for(i2=0; i2<16; i2++)
      display.write(i1*16+i2);
    display.println("");
  }
  display.display();
}
void TEST_display_3()
{
  display.clearDisplay(); 
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println(utf8rus("АБВГДЕЖЗИЙКЛМНОП"));
  display.println(utf8rus("РСТУФХЦЧШЩЪЫЬЭЮЯ"));
  display.println(utf8rus("абвгдежзийклмноп"));
  display.println(utf8rus("рстуфхцчшщъыьэюя"));
  display.println(utf8rus("Ёё123ABCabc!@#\xBC\xBD"));
  display.println(utf8rus("10\x83 10\x8A\x82 10\x81\x80 2\x85"));
  display.display();  
}
void TEST_display_4()
{
  display.clearDisplay(); 
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.println(utf8rus("Размер шрифта 1"));
  display.setTextSize(2);
  display.println(utf8rus("Размер 2"));
  display.setTextSize(3);
  display.println(utf8rus("Разм 3"));
  display.display();  
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

Данный метод вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240.

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

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

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#15 Дисплей SSD1306 подключаем к Arduino. Выводим текст, рисуем фигуры. http://portal-pk.ru/news/232-displei-ssd1306-podklyuchaem-k-arduino-vyvodim-tekst-risuem.html Константин Portal-PK 2019-11-22T12:05:44+03:00 В этом уроке расскажу, как работать с 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE . Покажу как вывести текст и нарисовать фигуры . Как выводить текст на русском языке покажу в следующем уроке.

OLED-дисплей, который я буду использовать в этом уроке, - это модель SSD1306: 0,96-дюймовый с разрешением 128×64 пикселя, как показано на фото ниже.

0,96-дюймовый SSD1306 OLED-дисплем

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

Дисплей поможет вам автоматизировать ваше производства, а полиэтиленовый рукав поковать вашу продукцию. Где полиэтиленовый рукав купить ? На сайте МТ-ПАК ТОРГ.

SSD1306 OLED-дисплем в среде Arduino IDE

Модель, которую я использую, имеет четыре контакта и взаимодействует с любым микроконтроллером, используя протокол связи I2C. Есть, которые используют протокола связи SPI. Есть модели, которые поставляются с дополнительным выводом сброса.

Технические параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Дисплей OLED SSD1306 Описание подключения.
Поскольку OLED-дисплей использует протокол связи I2C, подключение очень простое. Как подключить к Arduino UNO или Arduino NANO смотрите в таблице ниже.

Pin

Arduino UNO или Arduino NANO

Vin

5v

GND

GND

SCL

A5

SDA

A4

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

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

Установка библиотеки SSD1306 OLED

Существует несколько библиотек, доступных для управления OLED-дисплеем. В этом уроке я буду использовать две библиотеки Adafruit: библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX .

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками.

Должен открыться менеджер библиотеки.

2. Укажите “ SSD1306” в поле поиска, выберете из списка и установите библиотеку от Adafruit SSD1306

Должен открыться менеджер библиотеки.

3. Аналогично установите вторую библиотеку, для этого в поле поиска укажите “ GFX

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

4. После установки библиотеки перезагрузите среду разработки Arduino.


Тестирование OLED-дисплея
После подключения OLED-дисплея к Arduino и установки всех необходимых библиотек, вы можете использовать один пример из библиотеки, чтобы увидеть, все ли работает правильно.

В вашей среде разработки Arduino, выберите Файл > Примеры > Adafruit SSD1306 и выберете тип вашего дисплея. В моем случае это 128х64_i2c.

Вот код примера для моего дисплея SSD1306

Вот код примера для моего дисплея SSD1306

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES     10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };
void setup() {
  Serial.begin(9600);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds
  // Clear the buffer
  display.clearDisplay();
  // Draw a single pixel in white
  display.drawPixel(10, 10, SSD1306_WHITE);
  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);
  // display.display() is NOT necessary after every single drawing command,
  // unless that's what you want...rather, you can batch up a bunch of
  // drawing operations and then update the screen all at once by calling
  // display.display(). These examples demonstrate both approaches...
  testdrawline();      // Draw many lines
  testdrawrect();      // Draw rectangles (outlines)
  testfillrect();      // Draw rectangles (filled)
  testdrawcircle();    // Draw circles (outlines)
  testfillcircle();    // Draw circles (filled)
  testdrawroundrect(); // Draw rounded rectangles (outlines)
  testfillroundrect(); // Draw rounded rectangles (filled)
  testdrawtriangle();  // Draw triangles (outlines)
  testfilltriangle();  // Draw triangles (filled)
  testdrawchar();      // Draw characters of the default font
  testdrawstyles();    // Draw 'stylized' characters
  testscrolltext();    // Draw scrolling text
  testdrawbitmap();    // Draw a small bitmap image
  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(1000);
  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
void loop() {
}
void testdrawline() {
  int16_t i;
  display.clearDisplay(); // Clear display buffer
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn line
    delay(1);
  }
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000); // Pause for 2 seconds
}
void testdrawrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2; i+=2) {
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }
  delay(2000);
}
void testfillrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2; i+=3) {
    // The INVERSE color is used so rectangles alternate white/black
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }
  delay(2000);
}
void testdrawcircle(void) {
  display.clearDisplay();
  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfillcircle(void) {
  display.clearDisplay();
  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
    // The INVERSE color is used so circles alternate white/black
    display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn circle
    delay(1);
  }
  delay(2000);
}
void testdrawroundrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfillroundrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    // The INVERSE color is used so round-rects alternate white/black
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_INVERSE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testdrawtriangle(void) {
  display.clearDisplay();
  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfilltriangle(void) {
  display.clearDisplay();
  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
    // The INVERSE color is used so triangles alternate white/black
    display.fillTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testdrawchar(void) {
  display.clearDisplay();
  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font
  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }
  display.display();
  delay(2000);
}
void testdrawstyles(void) {
  display.clearDisplay();
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));
  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  display.println(3.141592);
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);
  display.display();
  delay(2000);
}
void testscrolltext(void) {
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));
  display.display();      // Show initial text
  delay(100);
  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}
void testdrawbitmap(void) {
  display.clearDisplay();
  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();
  delay(1000);
}
#define XPOS   0 // Indexes into the 'icons' array in function below
#define YPOS   1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  int8_t f, icons[NUMFLAKES][3];
  // Initialize 'snowflake' positions
  for(f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
    icons[f][YPOS]   = -LOGO_HEIGHT;
    icons[f][DELTAY] = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(F(" y: "));
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons[f][DELTAY], DEC);
  }
  for(;;) { // Loop forever...
    display.clearDisplay(); // Clear the display buffer
    // Draw each snowflake:
    for(f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
    }
    display.display(); // Show the display buffer on the screen
    delay(200);        // Pause for 1/10 second
    // Then update coordinates of each flake...
    for(f=0; f< NUMFLAKES; f++) {
      icons[f][YPOS] += icons[f][DELTAY];
      // If snowflake is off the bottom of the screen...
      if (icons[f][YPOS] >= display.height()) {
        // Reinitialize to a random position, just off the top
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
      }
    }
  }
}

Если ваш OLED дисплей не имеет pin сброса, вы должны установить переменную OLED_RESET в значение -1, как показано ниже.

#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)

Не забудьте выбрать нужную плату и COM порт в меню Инструменты.

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


Если ваш OLED-дисплей ничего не показывает:
Убедитесь, что OLED-дисплей правильно подключен к Ардуино.
Также вы должны изменить OLED-адрес в следующей строке, например на 0x3D, если это необходимо. В моем случае адрес 0x3C.

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {


Вывод текста на дисплей

Библиотека Adafruit для OLED-дисплея поставляется с несколькими функциями для вывода текста. В этом разделе вы узнаете, как писать и прокручивать текст с помощью функций библиотеки.
“Hello, world!” OLED-дисплей
Следующий код отображает Hello, world! сообщение на дисплее.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.setFont(&FreeSerif9pt7b);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,20);             
  display.println("Hello, world!");
  display.display();
  delay(2000); 
}
void loop() {
}

После загрузки кода вот, что вы получите в вашем дисплее.

Следующий эскиз отображает Hello, world! сообщение на дисплее.


Рассмотрим скетч подробнее.

Импорт библиотек
Во-первых, вам нужно импортировать необходимые библиотеки. Библиотека для использования I2C и библиотеки Adafruit для вывода информации на дисплей: Adafruit_GFX и Adafruit_SSD1306

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Инициализация OLED-дисплея
Затем, вы определяете свою ширину и высоту дисплея. В этом примере я использую OLED-дисплей 128×64. Если вы используете другие размеры, вы можете изменить это в переменных SCREEN_WIDTH и SCREEN_HEIGHT

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Затем инициализируйте экранный объект, с шириной и высотой, определенными ранее с помощью протокола связи I2C (&Wire).

dafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Параметр (-1) означает, что ваш OLED-дисплей не имеет pin сброса. Если ваш OLED-дисплей имеет пин сброса, то он должен быть подключен к GPIO. В этом случае вы должны передать номер GPIO.
В setup () инициализируйте последовательный монитор на скорости передачи данных 9600 бод для отладки.

Serial.begin(9600);

Инициализируйте OLED-дисплей с помощью метода begin() следующим образом

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
  Serial.println("SSD1306 allocation failed");
  for(;;); // Don't proceed, loop forever
}

Этот фрагмент выводит сообщение на последовательный монитор, если вы не можете подключиться к дисплею.

Так же, вам может потребоваться изменить адрес OLED. В моем случае адрес 0x3C.

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

Рассказывал об этом выше.

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

delay(2000);

Очистить дисплей, установить размер шрифта, цвет и написать текст.

После инициализации дисплея очистите буфер дисплея с помощью метода clearDisplay().

 display.clearDisplay();

Перед написанием текста, вам нужно установить размер текста, цвет и где текст будет отображаться в OLED.

Установите размер шрифта с помощью метода setTextSize().

Установите цвет шрифта с помощью метода setTextColor().

display.setTextColor(WHITE);

WHITE устанавливает белый шрифт и черный фон.

Определите позицию, с которой начинается текст, используя метод setCursor(x, y). В этом случае, вы устанавливаете текст, чтобы начать с координат (0,10).

Наконец, можно отправить текст на дисплей с помощью метода println (), как показано ниже.

display.println("Hello, world!");

Затем, вам нужно вызвать метод display (), чтобы фактически отобразить текст на экране.

Наконец, можно отправить текст на дисплей с помощью метода println (), как показано ниже

Библиотека Adafruit OLED предоставляет полезные методы для легкой прокрутки текста.

startscrollright(0x00, 0x0F): прокрутка текста слева направо
startscrollleft(0x00, 0x0F): прокрутка текста справа налево

Следующий скетч реализует методы прокрутки текста:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  // Display static text
  display.println("Scrolling Hello");
  display.display(); 
  delay(100);
}
void loop() {
  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
}


Нарисуйте фигуры на OLED-дисплее

Библиотека Adafruit OLED предоставляет полезные методы для рисования пикселей, линий и фигур. Давайте рассмотрим эти методы.

Чтобы нарисовать пиксель на OLED-дисплее, можно использовать метод drawPixel(x, y, color), который принимает в качестве аргументов координаты x и y, где появляется пиксель, и цвет. Например

display.drawPixel(64, 32, WHITE);

Чтобы нарисовать пиксель на OLED-дисплее

Нарисовать линию

Используйте метод drawLine(x1, y1, x2, y2, color) для создания линии. Координаты (x1, y1) указывают начало линии, а координаты (x2, y2) указывают, где заканчивается линия.

Например

display.drawLine(0, 0, 127, 20, WHITE);

Нарисовать линию

Нарисуйте прямоугольник

DrawRect (x, y, width, height, color) обеспечивает простой способ рисования прямоугольника. Координаты (x, y) указывают на верхний левый угол прямоугольника. Затем вам нужно указать ширину, высоту и цвет.

display.drawRect(10, 10, 50, 30, WHITE);

Вы можете использовать fillRect(x, y, width, height, color) для рисования заполненного прямоугольника. Этот метод принимает те же аргументы, что и drawRect.

Нарисуйте прямоугольник

Библиотека также предоставляет методы для отображения прямоугольников с закругленными углами : drawRoundRect () и fillRoundRect (). Эти методы принимают те же аргументы, что и предыдущие методы, плюс радиус угла. Например

display.drawRoundRect(10, 10, 30, 50, 2, WHITE);

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

Или заполненный со скругленными углами прямоугольник:

display.fillRoundRect(10, 10, 30, 50, 2, WHITE);

Чтобы нарисовать круг, используйте метод drawCircle(x, y, radius, color). Координаты (x, y) указывают на центр окружности. Вы также должны передать радиус в качестве аргумента. Например

display.drawCircle(64, 32, 10, WHITE);

Чтобы нарисовать круг

Таким же образом, чтобы построить заполненный круг, используйте метод fillCircle() с теми же аргументами:

display.fillCircle(64, 32, 10, WHITE);

Нарисуйте треугольник

Используйте метод drawTriangle(x1, y1, x2, y2, x3, y3, color) для построения треугольника. Этот метод принимает в качестве аргументов координаты каждого угла и цвет.

display.drawTriangle(10, 10, 55, 20, 5, 40, WHITE);

Нарисуйте треугольник

Используйте метод fillTriangle (), чтобы нарисовать заполненный треугольник:

display.fillTriangle(10, 10, 55, 20, 5, 40, WHITE);

Используйте метод fillTriangle (), чтобы нарисовать заполненный треугольник:

Инвертирование

Библиотека предоставляет дополнительный метод, который можно использовать с фигурами или текстом: метод invertDisplay (). Передайте true в качестве аргумента, чтобы инвертировать цвета экрана, или false, чтобы вернуться к исходным цветам.

Если вы вызываете следующую команду после определения треугольника

display.invertDisplay(true);

Вы получите черный треугольник, а фон будет подсвечен.

Библиотека предоставляет дополнительный метод, который можно использовать с фигурами или текстом

Код для рисование всех фигур
Загрузите следующий скетч в Arduino, который реализует каждый фрагмент кода, который я рассмотрел ранее, и выведет все фигуры.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
  // Clear the buffer
  display.clearDisplay();
  // Draw a single pixel in white
  display.drawPixel(64, 32, WHITE);
  display.display();
  delay(3000);
  // Draw line
  display.clearDisplay();
  display.drawLine(0, 0, 127, 20, WHITE);
  display.display();
  delay(3000);
  // Draw rectangle
  display.clearDisplay();
  display.drawRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);
  // Fill rectangle
  display.fillRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);
  // Draw round rectangle
  display.clearDisplay();
  display.drawRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
  // Fill round rectangle
  display.clearDisplay();
  display.fillRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
  // Draw circle
  display.clearDisplay();
  display.drawCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
  // Fill circle
  display.fillCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
  // Draw triangle
  display.clearDisplay();
  display.drawTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);
  // Fill triangle
  display.fillTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);
  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(3000);
  display.invertDisplay(false);
  delay(3000);
}
void loop() {
}

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

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

Всем Пока-Пока. И до встречи в следующем уроке.


]]>
Часы на Arduino и дисплее Nextion с выводом температуры и влажности. http://portal-pk.ru/news/231-chasy-na-arduino-i-displee-nextion-s-vyvodom-temperatury-i.html Константин Portal-PK 2019-11-14T14:07:05+03:00 Медленно, но верно разрабатываю часы на Arduino с дисплеем Nextion, с выводом температуры и влажности. Данные часы не ограничатся функционалом, о котором расскажу в данной статье. Будут еще 2-3 этапа доработки проекта на Arduino и сенсорным дисплеем Nextion. Скетч и прошивку для дисплея можно скачать внизу статьи. Для этого вам нужно зарегистрироваться на сайте Portal-PK.ru.

часы на Arduino с дисплеем Nextion

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

Корпус сразу не получился . Было пару неудачных вариантов. Тем более в этом мне помогал школьник. В видео мой помощник Семен Семеныч - вымышленный персонаж. А моего юного помощника зовут по другому.

Сделав несколько неудачных попыток, в итоге остановились на двух более удачных версиях:

1. Обклеили скотчем.

Обклеили скотчем.

2. Покрасили из баллончика.

Обклеили скотчем.

Опрос в нашей группе «В Контакте» показал, что покрашенный корпус для часов нравится больше , поэтому используем именно его для примера. В качестве ножек использовал болты М6.


Электронные комплектующие , которые я использовал при создании часов на Arduino с дисплеем Nextion:

1. Arduino Nano V3.0 (ATmega328). Версия Arduino Nano V2.0 (ATmega168) не подойдет, так как для текущего функционала недостаточно памяти.

2. Дисплей Nextion 2,8 дюйма. Можно и другого размера.

3. Датчик температуры и влажности SHT3x (SHT31) .

4. Часы реального времени (RTC) DS3231, я использовал версию mini.

5. Разъем 5.5 мм, для подключения питания часов.

Соединяем электронику часов по схеме :

Соединяем электронику часов на Arduino с дисплеем Nextion по схеме

Электроника на макетной плате выглядит так.

Электроника на макетной плате выглядит так.

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

После чего осталось установить все в корпус

Собрать электронику можно без пайки . Для этого я использовал соединительные разъемы 2,54 мм. Правда паяльник все же пришлось взять в руки, так как нужно припаять провода питания к разъему 5,5 мм . А так же Arduino NANO у меня была без ножек.

Правда паяльник все же пришлось взять в руки, так как нужно припаять провода питания к разъему 5,5 мм.

На данный момент часы умеют:

1. Выводить дату и время в энергосберегающем режиме. Как я его назвал «Экран бездействия». На него часы переключаются автоматически по истечению 30 сек, если вы ни чего не делаете.

2. На основном экране кроме даты и времени выводить температуру и влажность . А также дополнительное меню, в котором, на данный момент, работает только одна кнопка настроек часов.

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

Вот такие замечательные часы на Arduino с дисплеем Nextion, с выводом температуры и влажности, получились.

Вот такие замечательные часы на Arduino с дисплеем Nextion, с выводом температуры и влажности , получились.

Скоро будет продолжение. не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#14 Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) http://portal-pk.ru/news/230-podklyuchaem-k--arduino-datchik-vlazhnosti-i-temperatury.html Константин Portal-PK 2019-11-08T08:45:21+03:00 Существует большое количество датчиков для Arduino, которые измеряют температуру и влажность. Сегодня я хотел бы рассказать про датчик серии SHT3x (SHT31). Данный сенсор достаточно новый и про него мало информации в сети интернет. После его проверки у меня остались положительные впечатления. Датчик достаточно точный и не сильно инерционный.

 датчик серии SHT3x (SHT31)

Точность этого модуля составляет ± 2% RH (для относительной влажности) и ± 0.3 °C (для температуры). Модуль осуществляет связь с последовательной шиной I2C и может работать со скоростью до 1 МГц.

Характеристики модуля температуры и влажности серии SHT3x :
- Входное напряжение (Vcc): 3.3 В или 5 В;
- I/O логический уровень: 3.3 В или 5 В (основывается на Vcc);
- Рабочий ток: 100 мА;
- Рабочая температура: -40...+125 ℃;
- Диапазон измерения температуры: -40...+125 ℃ ±0.3°C;
- Диапазон измерения RH: 0...100% ±2%;
- Сенсор: SHT31;


Уроки про другие датчики температуры и влажности:

Урок 10 - Датчик температуры DS18B20, подключаем к Arduino.

Урок 9 - Подключаем датчик температуры и влажности DHT11 к Arduino


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

1. Arduino UNO или Arduino NANO .

2. Датчик SHT3x.

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) по схеме:

Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) по схеме

Для работы нам понадобится библиотека Adafruit_SHT31.

Которую можно скачать тут.

После установки библиотеки, выберем пункт в меню Arduino IDE:

Файл > Примеры > Adafruit SHT31 Library > SHT31test

Adafruit SHT31 Library

Откроется вот такой скетч, который загружаем в Arduino.

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
  Serial.begin(9600);
  while (!Serial)
    delay(10);     // will pause Zero, Leonardo, etc until serial console opens
  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }
}
void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();
  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.println(t);
  } else { 
    Serial.println("Failed to read temperature");
  }
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }
  Serial.println();
  delay(1000);
}

Откроем монитор порта и увидим вот такой результат:

Откроем монитор порта и увидим вот такой результат

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

Мое личное мнение:

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

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

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

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
#13.4 Считывание данных с SD карты, и сохранение их как «переменные» http://portal-pk.ru/news/229-134-schityvanie-dannyh-s-sd-karty-i-sohranenie-ih-kak.html Константин Portal-PK 2019-11-07T08:36:39+03:00 Объем энергонезависимой памяти EEPROM в Arduino небольшой. И как же хранить больш ой объем данных без потери при перезагрузке? Для решения этой задачи на помощь приходит SD карта .

Arduino без проблем может создавать, удалять файлы, а также записывать данные в файлы. Об этом я рассказывал в предыдущих уроках:

#13.1.Arduino SD карта. Создаем, удаляем файлы.Чтение, запись файлов.

Урок 13.3 Arduino строим графики по данным c sd карты.

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

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

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем SD-модуль к Arduino UNO по такой схеме.

Подключаем SD-модуль к Arduino UNO по такой схеме.

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

    7,20;
    7,00;
    7,20;
    6,40;
    7,00;
    9,00;
    9,00;

Я использую символы: точка запятой - это конец строки, и запятая - это разделитель между значениями (разделители можно использовать любые).

Назовем файл config.txt. Установим карту памяти в SD-модуль.

Назовем файл config.txt. Установим карту памяти в SD-модуль.

Напишем небольшой скетч, который будет считывать данные с SD-карты и сохранять данные в «переменные». И выводить полученное расписание будильника на монитор порта.

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 8;
//Массив времени будильника. Можем использовать в любой строчке кода
char* names[7][2];
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // вызавим функцию для загрузки расписания будильника.
  configSD();
}
void loop() 
{
  // после завершения настройки ничего не делать.
}
void configSD() // функции чтения конфигурационного файла с SD
{
  // вспомогательные переменные
  int h = 0; 
  int q = 0;       
  int d=7;
  char array[d][10];
  char *buffer;
  char symbol2 = 0;
  File configFile = SD.open("config.txt");
  if (configFile) 
  {
      Serial.println("config.txt open OK");
      // файл существует считываем из него данные 
        while  (configFile.available())   
        {
          // считываем байт входящего файла
          symbol2 = configFile.read();
          if (symbol2==';') // символ конца строки
          {
            array[q][h]='\0'; 
            q++; 
            h=0; 
          }
          else // если еще не конец строки посимвольно добавляем 
          {
            array[q][h] = symbol2; 
            h++;
          }
          delay(2);
        }
      configFile.close(); // закрываем файл
  }
  char *p;
  byte t;
  // разберем полученные строки разделитель запятая
  for (int j=0; j < d; j++) 
  {
    t = 0;
    for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
    {
      names[j][t]=buffer; // запишем в массив часы и мин.
      t++;
    }
  }
  for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта 
// данные из массива names[j][0] можно использовать в коде. 
         Serial.print(names[j][0]); // вывод часов 
         Serial.print(":");         // разделитель
         Serial.print(names[j][1]); // вывод минут
     }
}

Давайте подробнее рассмотрим код.

Считывание файла с SD карты вынесено в отдельную функцию. Вызываем данную функцию в блоке void setup(). Так как нам достаточно 1 раз считать расписание будильника, сохранить в «переменную» и использовать в дальнейшем. При необходимости изменить расписание будильника можно повторно вызвав данную функцию.

// вызавим функцию для загрузки расписания будильника.
  configSD();

Массив char* names[7][2]; находится в разделе «глобальных переменных» не случайно. Так как данную «переменную» мы сможем использовать в любом месте кода, и, соответственно, получить расписание будильника .

// файл существует считываем из него данные 
       while  (configFile.available())   
        {
          // считываем байт входящего файла
          symbol2 = configFile.read();
          if (symbol2==';') // символ конца строки
          {
            array[q][h]='\0'; 
            q++; 
            h=0; 
          }
          else // если еще не конец строки посимвольно добавляем 
          {
            array[q][h] = symbol2; 
            h++;
          }
          delay(2);
        }
      configFile.close(); // закрываем файл

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

// разберем полученные строки разделитель запятая
  for (int j=0; j < d; j++) 
  {
    t = 0;
    for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
    {
      names[j][t]=buffer; // запишем в массив часы и мин.
      t++;
    }
  }

В этом цикле мы разбираем наши строки на элементы разделенные запятой. И сохраняем в наш массив char* names[7][2];

Сейчас мы можем оперировать нашим расписанием.

Для обработки большего количества данных вы можете воспользоваться, например, Arduino MEGA

Давайте выведем в монитор порта наше расписание. Для этого напишем вот такой небольшой цикл:

  for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта 
// данные из массива names[][] можно использовать в коде. 
         Serial.print(names[j][0]); // вывод часов 
         Serial.print(":");         // разделитель
         Serial.print(names[j][1]); // вывод минут
     }

Данный пример можно доработать, чтоб обрабатывать другое количество данных с SD карты средствами Arduino. Но вы должны помнить, что чем больше данных вы будете сохранять в «переменную», тем больше вам понадобится динамической памяти, которой не так и много в Arduino UNO или NANO . Для обработки большего количества данных вы можете воспользоваться, например, Arduino MEGA или другой отладочной платой с большим объемом динамической памяти.

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

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
ESP32-CAM ov2640, потоковое видео в среде Arduino IDE. http://portal-pk.ru/news/228-esp32-cam-ov2640-potokovoe-video-v-srede-arduino-ide.html Константин Portal-PK 2019-11-05T13:26:12+03:00 Эта статья представляет собой краткое руководство по началу работы для платы ESP32-CAM. Я расскажу как настроить веб-сервер потокового видео менее, чем за 5 минут с помощью Arduino IDE.

Примечание: в этой статье я использую пример из библиотеки arduino-esp32, но не рассматриваю как его изменить.

ESP32-камера - это очень маленький модуль камеры с чипом ESP32-S

ESP32-камера - это очень маленький модуль камеры с чипом ESP32-S, который стоит около $ 10. Помимо камеры OV2640 и нескольких GPIO для подключения периферийных устройств, он имеет слот для карт microSD, который может быть полезен для хранения изображений, сделанных с помощью камеры, или хранения файлов.


Основные характеристики ESP32-CAM:

Беспроводной модуль - ESP32-S WiFi 802.11 b/g/n + модуль Bluetooth;

Внешнее хранилище - слот для карт micro- SD ёмкостью до 4 ГБ;

Поддержка камер OV2640 (продаётся с платой) или OV7670;

Формат изображения - JPEG (только OV2640), BMP, оттенки серого;

Светодиодная вспышка.

Контакты – 16 с интерфейсами UART, SPI, I2C, PWM

Напряжение питания - 5 В;

Потребляемая мощность:

  • при выключенной вспышке - 180 мА;
  • при включенной вспышке - 310 мА;
  • глубокий сон - 6 мА;
  • модем-сон - 20 мА;
  • лёгкий сон - 6,7 мА.

Размеры - 40,5 х 27 х 4,5 мм

Температурный диапазон:

  • рабочий: 20 – 85 ℃;
  • хранение: -40 - 90 ℃ при 90% относительной влажности.

Карты памяти на 4 Гб не было под рукой, поэтому проверить не получилось. Ставил на 16 Гб. Не сохраняет.

На следующем рисунке показаны выводы ESP32-CAM.

показаны выводы ESP32-CAM

Есть три вывода GND и два вывода для питания: 3.3 V, либо 5V.

GPIO 1 и GPIO 3 - это последовательные контакты. Вам нужны эти контакты, чтобы загрузить код на вашу плату. Кроме того, GPIO 0 играет важную роль, поскольку он определяет, находится ли ESP32 в режиме программирования или нет. Когда GPIO 0 подключен к GND, ESP32 находится в режиме программирования.


Для программирования ESP32-камеры понадобятся следующие компоненты:


Приступим к установке, настройке необходимого ПО и прошивке ESP32. Разделим вс ё на несколько этапов:

1. Установка дополнения ESP32
В этом примере я использую Arduino IDE для программирования платы ESP32-CAM. Установите Arduino IDE, и настройте работу с ESP32. Если этого у вас не сделано, воспользуетесь следующей инструкцией:

Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux)

2. Пример Кода CameraWebServer
В среде Arduino IDE выберите пример для работы с камерой для этого перейдите:

Файл > Примеры > ESP32 > Camera>CameraWebServer

Пример Кода CameraWebServer

Откроется пример скетча работы с камерой ESP32:

Откроется пример скетча работы с камерой ESP32:

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

После загрузки распакуйте папку и откройте файл скетча для esp32 cam ov2640: CameraWebServer.ino.

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

const char* ssid = "Имя_точки_wi-fi";
const char* password = "пароль_от_wi-fi";

Затем убедитесь, что вы выбрали правильный модуль камеры. В данном случае используйте модель AI-THINKER Model. Для этого закомментируйте все другие модели и раскомментируйте указанную ниже:

 данном случае используйте модель AI-THINKER Model.

#define CAMERA_MODEL_AI_THINKER

Теперь код готов к загрузке на вашу ESP32.

3. Прошивка ESP32-CAM

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

Подключаю всё вот по такой схеме:

Прошивка ESP32-CAM

Важно! GPIO 0 должен быть подключен к GND, чтобы вы смогли загрузить код.


Чтобы загрузить код, выполните следующие действия:

  • Перейдите в меню Инструменты > Плата и выберите модуль ESP32 Wrover
  • Перейдите в меню Инструменты > порт и выберите COM-порт, к которому подключен ESP32
  • В меню Инструменты > Partition Scheme , выберите “Huge APP (3MB No OTA)
  • Нажмите кнопку ESP32-CAM on-board RESET
  • Затем нажмите кнопку Загрузка, чтобы загрузить код

Чтобы загрузить код, выполните следующие действия:

Важно! Если вы не можете загрузить код, то еще раз проверьте, что GPIO 0 подключен к GND и, что вы выбрали правильные настройки в меню Инструменты. Вы также должны нажать кнопку сброса на борту, чтобы перезагрузить ESP32 в режиме программирования.

4. Получение IP-адреса и подключение к камере.

После загрузки кода отключите GPIO 0 от GND. Подключите питание на 5 В. На 3,3 В у меня камера не заработала.

Откройте последовательный монитор со скоростью передачи данных 115200. Нажмите кнопку ESP32-CAM on-board Reset.

IP-адрес ESP32 должен быть выведен в последовательном мониторе.

IP-адрес ESP32 должен быть выведен в последовательном мониторе.

Теперь вы можете получить доступ к серверу потоковой передачи камеры в локальной сети. Откройте браузер и введите IP-адрес ESP32-CAM . Нажмите кнопку Start Streaming, чтобы начать потоковую передачу видео.

Нажмите кнопку Start Streaming, чтобы начать потоковую передачу видео.

У вас так же есть возможность делать фотографии, нажав на кнопку Get Still. К сожалению, этот пример не сохраняет фотографии, но вы можете изменить его, чтобы использовать встроенную карту microSD для хранения полученных фотографий.

Есть еще несколько настроек камеры, с которыми вы можете поиграть, чтобы настроить параметры изображения.

Есть еще несколько настроек камеры, с которыми вы можете поиграть, чтобы настроить параметры изображения.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду, о скорости обработки и пр.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду

Чем выше качество потокового вещания, тем меньше кадров. Комфортно работает при разрешении 600х800.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду

Можно реализовать распознавание лиц. Но, пока, в данном направлении я не экспериментировал. Как будут результаты, обязательно напишу статью, или сделаю проект.

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

Всем Пока-Пока. И до встречи в следующей статье.

]]>
Функция strtok_r() – разбиение строки на части по указанному разделителю. Arduino IDE http://portal-pk.ru/news/227-funkciya-strtok_r---razbienie-stroki-na-chasti-po.html Константин Portal-PK 2019-11-05T12:11:59+03:00 Функция strtok_r() – разбиение строки на части по указанному разделителю. Arduino IDE

char *strtok_r(char *str, const char *delim, char **saveptr);

Пример работы функции

void testsChar()
{
  char *str;
  char sz[] = "wills,this,works,40,43";
  char *p = sz;
  while ((str = strtok_r(p, ",", &p)) != NULL) 
    {
     Serial.println(str);
    }
}
]]>
Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux) http://portal-pk.ru/news/226-ustanovka-proshivka-platy-esp32-v-arduino-ide-windows-mac-os-x-linux.html Константин Portal-PK 2019-11-03T17:06:22+03:00 Существует надстройка для Arduino IDE, которая позволяет программировать ESP32 с использованием Arduino IDE и его языка программирования. В этой статье мы покажем вам, как установить плату ESP32 в Arduino IDE, не зависимо от используемой вами операционной системы: Windows, Mac OS X или Linux.

Урок 1. Веб-сервер ESP32 (ESP8266) в среде Arduino IDE

Если у вас возникли какие-либо проблемы во время процедуры установки, сообщите об этом на форуме.

esp32 devkit

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


Установка дополнения ESP32 в Arduino IDE

Чтобы установить плату ESP32 в Arduino IDE, выполните следующие действия:
1. В вашем Arduino IDE перейдите в Файл> Настройки

установить плату ESP32 в Arduino IDE

2. Войдите https://dl.espressif.com/dl/package_esp32_index.json. в поле "Дополнительные ссылки для менеджера платы", как показано на рисунке ниже. Затем нажмите кнопку OK.

Дополнительные ссылки для менеджера платы

Внимание: Если вы у вас установлена в Arduino IDE ESP8266 то добавьте 2 строки или через запятую:

    https://dl.espressif.com/dl/package_esp32_index.json

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

3. Откройте Менеджер плат. Перейдите в меню Инструменты > Платы > Менеджер плат

Менеджер плат

4. Ищем ESP32. И нажимаем кнопку Установка.

Ищем ESP32

5. Вот и все. Через пару минут у вас все установиться.


Первая загрузка скетча в ESP32.

Подключите плату ESP32 к компьютеру. Открываем Arduino IDE и выполним следующие действия:

1. Выберите доску в меню Инструменты > Плата (в моем случае это DOIT ESP32 DEVKIT V1 )

Инструменты WiFiScan

Плата (в моем случае это DOIT ESP32 DEVKIT V1)" width="382" height="240" style="display: block; margin: auto; width: 382px; height: 240px;" rel="display: block; margin: auto; width: 382px; height: 240px;">

2. Выберите порт (если вы не видите COM-порт в Arduino IDE, вам необходимо установить драйверы CP210x USB to UART Bridge VCP). В моем случае ком порт отображается по другому. Это связанно с тем что я использую OS Linux.

Выберите порт

3. Открыть в следующем примере в Файл > Примеры > WiFi > WiFiScan

Примеры WiFiScan

4. В вашей среде Arduino IDE откроется новый скетч.

Arduino IDE откроется новый скетч

5. Нажмите кнопку Загрузить в Arduino IDE. Подождите несколько секунд, пока код компилируется и загружается на вашу плату.

 Загрузить в Arduino IDE

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

Нажмите кнопку Boot

6. Откройте последовательный монитор Arduino IDE со скоростью передачи данных 115200.

 Откройте последовательный монитор Arduino IDE

7. Нажмите кнопку EN на борту ESP32 , и вы увидите список сетей, доступных для вашей ESP32.

Распиновка ESP32 DEVKIT V1

Подведение итогов.
Это краткое руководство, которое иллюстрирует, как подготовить ваш Arduino IDE для ESP32 на компьютере с ОС Windows, Mac OS X или Linux. Если во время установки возникнут какие-либо проблемы, пишите на форум.

Теперь вы можете начать создавать свои собственные проекты IoT с ESP32.

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

Всем Пока-Пока. И до встречи в следующей статье.

]]>
Урок 13.3 Arduino строим графики по данным c sd карты. http://portal-pk.ru/news/225-arduino-stroim-grafiki-po-dannym-c-sd-karty.html Константин Portal-PK 2019-10-18T14:59:30+03:00 Сегодня в уроке мы сохраним данные и время считывания данных в файл. Который можно открыть в Excel и построить график.

Как вывести график на смартфон, в режиме реального времени смотрите тут: Arduino SD карта. Воспроизводим звуки и музыку в wav формате.

Arduino строим графики

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

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительныепровода.

5. Модуль реального времени DS3231


Модуль DS3231 выбрал не случайно. В нем есть датчик температуры . И мы можем сохранять значение температуры и время замеров .

Это наглядный пример использования легирование показаний с датчиков . Вы можете использовать другое датчики: DS18B20, DHT11, DHT22 . Также вы можете использовать одновременно несколько датчиков и сохранять показание с них.

Подключаем SD-модуль и модуль реального времени DS3231 к Arduino UNO по схеме.

Подключаем SD-модуль и модуль реального времени DS3231 к Arduino UNO по схеме.

Для работы нам понадобиться библиотека DS3231.h. Скачать ее можно с сайта разработчика или в разделе для скачивания файлов внизу страницы.

Мы уже научились работать с картой, если возникнут сложности посмотрите предыдущий урок: Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов.

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

#include <DS3231.h> // Библиотека для часов реального времени 
// Подключаем часы реального времени 
DS3231  rtc(SDA, SCL);    //(A4 = SDA, A5 = SCL)
void setup() {
....
rtc.begin(); // инициализируем часы реального времени   
}

Для вывода текущего времени и температуры есть 2 функции.

#include <SD.h>
#include <SPI.h>
#include <DS3231.h> // Библиотека для часов реального времени 
File myFile;
// Подключаем часы реального времени 
DS3231  rtc(SDA, SCL);    //(A4 = SDA, A5 = SCL)
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() {
 // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  rtc.begin(); // инициализируем часы реального времени   
}
void loop() {
  // выведим время и черз запятую температуру с дачика модуля DS3231
  Serial.print(rtc.getTimeStr());
  Serial.print(",");
  Serial.println(int(rtc.getTemp()));
 // открываем файл для записи
  myFile = SD.open("test.csv", FILE_WRITE);
  if (myFile) {  /// записываем данные черз запятую  
    myFile.print(rtc.getTimeStr());
    myFile.print(",");    
    myFile.println(int(rtc.getTemp()));
    myFile.close(); // закрываем файл
  }
  // Если не получилось открыть файл для записи выводим ошибку
  else {
    Serial.println("error opening test.txt");
  }
  delay(10000); /// ждем 10 сек. И повторяем запись данных в файл.
}

Для примера работы выведем время и показания в монитор порта.

Для примера работы выведем время и показания в монитор порта.

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

 А можно сохранить в файл TEST.csv.

Можно сохранять в текстовый файл. А можно сохранить в файл TEST.csv.

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

Это тоже текстовый файл. Но его можно сразу открыть в Excel.

 TEST.csv. Это тоже текстовый файл. Но его можно сразу открыть в Excel.

Осталось только построить график по полученным данным.

У вас наверное возникнет вопрос, почему у меня так скачет температура? Нет у меня нет резкого изменения температуры в комнате. Просто я погрел пальцами модуль времянки. И после он постепенно остывал.

Этот небольшой урок дает представления о возможностях легирования данных с использованием Arduino и SD карты.

Этот небольшой урок дает представления о возможностях легирования данных с использованием Arduino и SD карты.

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

Всем Пока-Пока. И до встречи в следующем уроке.


]]>
Обзор панели управления самодельного ЧПУ. Запуск фрезерования. http://portal-pk.ru/news/224-obzor-paneli-upravleniya-samodelnogo-chpu-zapusk.html Константин Portal-PK 2019-10-15T08:29:31+03:00 Продолжаю обзор самодельного фрезерного ЧПУ станка с дисплеем . И сегодня рассмотрим панель управления. И основные настройки станка. Обзор станка и пример фрезерования смотрите тут: Самодельный ЧПУ фрезерный станок на Arduino с дисплеем

Продолжаю обзор самодельного фрезерного ЧПУ станка с дисплеем.

Немного предыстории. Как-то раз сидел я за компьютером дела модель для своего 3D принтера Annet A8. Про который я уже рассказывал. И делал модернизацию. И вот сижу и думаю. Почему 3Д принтеры так популярны. Даже в нашем небольшом городе их достаточно много.

Да, стоят они недорого. Но это не основной критерий их популярности, по моему мнению. Основной фактор такой большой популярности это относительно простата сборки и использования. У меня отец предпенсионного возраста без проблем печатает на 3Д принтер. Также принтеры имеют небольшой размер, что позволяет их поставить даже в квартире. Возможно добавить дешевый и разнообразный выбор пластика. Но мы живем в России и проблем с разнообразием древесины у нас нет. И стоимость фанеры у нас небольшая. Так что этот фактор рассматривать не буду. А вы как как думаете? Пишите ваше мнение в комментариях.

И тут я задался вопросом. А можно ли сделать более доступный ЧПУ фрезерный станок? Для этого нужно сделать его небольших размеров и с простым управлением. На подобии 3D принтера. Стоимость скорее всего сильно снизить не получиться.

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

Взял за основу одну из распространенных прошивку для 3D принтеров Marlin.

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

Есть ряд недочетов.Основная которая бросается в глаза это местами проскакивает слова «печать» и не все перевел на русский язык. Но это дела техники.

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

Самодельный фрезерный станок с ЧПУ основную задачу выполняет.

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

В следующей статье расскажу подробнее о электронике и прошивке поэтому не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#13.2 Arduino SD карта. Воспроизводим звуки и музыку в wav формате. http://portal-pk.ru/news/223-arduino-sd-karta-vosproizvodim-zvuki-i-muzyku-v-wav-formate.html Константин Portal-PK 2019-10-14T13:45:40+03:00 Продолжаем работу с SD картой в среде Ardino IDE. И сегодня мы будем воспроизводить мелодии и уведомления с карты памяти .

Качество воспроизводимой музыки не очень хорошее . Смотрите пример в виде. Звук тихий так как мелодии и оповещения воспроизводятся без какого либо усиления. Так звук воспроизводит Arduino. Не забудьте добавить звук при просмотре видео.

Это связанно с вычислительными способностями Arduino. Поэтому требования к аудио файлам будут напрямую зависеть от возможности микроконтроллера данной отладочной платы:

  • частота дискретизации: 16000 Гц;
  • количество каналов: моно;
  • количество бит: 8.

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

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

 Скачаем нужные нам треки или уведомления и конвертируем их

После чего скачиваем полученный трек и загружаем его на флешку.

После чего скачиваем полученный трек и загружаем его на флешку.

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

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

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

Подключаем SD-модуль и динамик к Arduino UNO по такой схеме.

Подключаем SD-модуль и динамик к Arduino UNO по такой схеме.

Для данного урока нам понадобится библиотека TMRpcm, которая умеет асинхронного воспроизведения PCM/WAV файлов напрямую с SD карты.

Скачать и более подробная документация смотрите на GitHub .

Основные функции библиотеки TMRpcm.


music.play("sound.wav");      // Воспроизвести файл на выходе 0
music.play("sound.wav",30,1); // Воспроизвести файл, начиная с 30-ой секунды, на выходе 1
music.play("sound.wav",0);    // play(имя_файла, выход 0 или 1) определяется speakerpin или speakerpin2
music.stopPlayback(0);     // Может принимать номер выхода 0 или 1
music.volume(0,1);         // Уменьшить громкость на выходе 1

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


#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
TMRpcm music;   // создать объект для использования в данном скетче
void setup()
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(5);    //   от 0 до 7. Установка уровня громкости
  music.quality(1);        //  1 для 2x передескритезации, 0 for для нормального режима
}
void loop()
{  
  music.play("sounds/2.wav");
    Serial.println("Play 2.wav");
    delay(30000);
  music.play("sounds/1.wav");
    Serial.println("Play 1.wav");
    delay(10000);
  music.play("sounds/3.wav");
    Serial.println("Play 3.wav");
    delay(10000);
  music.play("sounds/4.wav");
    Serial.println("Play 4.wav");
    delay(3000);
  music.play("sounds/5.wav");
    Serial.println("Play 5.wav");
    delay(3000);
  music.play("sounds/6.wav");
    Serial.println("Play 6.wav");
    delay(3000);
}

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

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

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

Управлять будем через Монитор порта.

Команды:

1 - воспроизводим трек

2 - воспроизвести трек, начиная с 30-ой секунды

3 - поставить воспроизведение на паузу / продолжить воспроизводить

4 - устанавливает уровень громкости 0 — выключаем.

5 - устанавливает уровень громкости 5 -включаем (макс. 7).

0 - выключаем воспроизведение трека.


#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
int ser = 0;  // значение из порта
TMRpcm music;   // создать объект для использования в данном скетче
void setup()
{
 // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(5);    //   от 0 до 7. Установка уровня громкости
  music.quality(1);        //  1 для 2x передескритезации, 0 for для нормального режима
}
void loop()
{  
 if (Serial.available() > 0) // пришли данные
 {
   ser = Serial.read();
    if (ser =='1')
    {
      music.play("sounds/2.wav");
        Serial.println("Play 2.wav");
    //delay(30000);
    }
    else if (ser =='2')
    {
      music.play("sounds/2.wav",30); // воспроизвести файл, начиная с 30-ой секунды
        Serial.println("Play 2.wav starting at 30 sec.");
    }
    else if (ser =='3')
    {
      music.pause();  // поставить воспроизведение на паузу / снять с паузы
        Serial.println("Pause");
    }
    else if (ser =='4')
    {
      music.setVolume(0); // от 0 до 7. Устанавливает уровень громкости.
        Serial.println("Set volume 0");
    }
    else if (ser =='6')
    {
      music.setVolume(5); // от 0 до 7. Устанавливает уровень громкости.
        Serial.println("Set volume 5");
    }
    else if (ser =='0')
    {
      music.disable(); // выключить таймер на выходном выводе и остановить воспроизведение
        Serial.println("Stop");
    }
  }
}

В мониторе порта видим что у нас все работает отлично.

В мониторе порта видим что у нас все работает отлично.

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

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

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
#13.1. Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов. http://portal-pk.ru/news/222-131-arduino-sd-karta-sozdaem-udalyaem-faily-chtenie-zapis.html Константин Portal-PK 2019-10-10T15:10:03+03:00 Во втором уроке просвещенном работе с SD картой . Научимся создавать и удалять файлы с помощью Arduino. Также запишем информацию в файл и считаем её. Как получить информацию о карте памяти и файлах хоронящихся на карте смотрите в предыдущем уроке: Урок13. Библиотека SD Arduino. Выводим информацию о SD карте.

Для роботы нам понадобится библиотека SD.h которую можно установить через менеджер библиотек.

библиотека SD.h которую можно установить через менеджер библиотек

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

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем SD-модуль к Arduino UNO по такой схеме.

Подключаем SD-модуль к Arduino UNO по такой схеме.

Давайте создадим файл на флешке, для этого используется функции SD.open(). Которая открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).

Remove() - Удаляет файл.

SD.exists() - проверяет существует ли файл.

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

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // проверим есть ли такой файл на флешке
  if (SD.exists("example.txt")) 
  {
    Serial.println("example.txt Есть такой. ");
  } 
  else 
  {
    Serial.println("example.txt нет. ");
  }
  // открыть новый файл и немедленно закрыть его
  Serial.println(" Создаем example.txt... ");
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.close();
  // проверить, существует ли файл:
  if (SD.exists("example.txt")) 
  {
    Serial.println(" example.txt Есть такой. ");
  } 
  else 
  {
    Serial.println("example.txt нет.");
  }
  // удалить файл:
  Serial.println("  Удаляем example.txt... ");
  SD.remove("example.txt");
  if (SD.exists("example.txt")) 
  {
    Serial.println(" example.txt есть такой. ");
  } 
  else 
  {
    Serial.println(" example.txt нет. ");
  }
}
void loop() 
{
  // после завершения настройки ничего не делать.
}

После загрузке в мониторе порта мы увидим вот такую информацию.

создания и удаления файлов с помощью библиотеки SD.

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

Если нам не нужно удалять файл, можно закомментировать строку отвечающую за удаления и уведомления, что будем удалять файл тоже лучше закомментировать.

// удалить файл:
 // Serial.println("  Удаляем example.txt... ");
 // SD.remove("example.txt");

Сейчас наш файл создан и не удален. С ним можно работать.

Сейчас наш файл создан и не удален. С ним можно работать.

Давайте создадим файл и запишем информацию в него. Код будит не очень сильно измене.

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // Открыть файл. Обратите внимание, что в какой-либо момент может быть открыт только один файл,
  // поэтому вы должны закрыть один файл перед открытием следующего.
  myFile = SD.open("test.txt", FILE_WRITE);
  // если файл открыт, то записать в него:
  if (myFile) 
  {
    Serial.print(" Запись в файл test.txt... ");
    myFile.println(" Текст: 1, 2, 3.");
    // закрыть файл:
    myFile.close();
    Serial.println("Ok.");
  } 
  else 
  {
    // если файл не открыт, то вывести сообщение об ошибке:
    Serial.println("ошибка открытия test.txt");
  }
  // снова открыть файл для чтения:
  myFile = SD.open("test.txt");
  if (myFile) 
  {
    Serial.println("test.txt:");
    // читать из файла, пока в нем ничего не останется:
    while (myFile.available()) 
    {
      Serial.write(myFile.read());
    }
    // закрыть файл:
    myFile.close();
  } 
  else 
  {
    // если файл не открыт, то вывести сообщение об ошибке:
    Serial.println("ошибка открытия test.txt");
  }
}
void loop() 
{
  // после завершения настройки ничего не делать.
}

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

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

Если перезагрузить Arduino. То текст запишется еще раз в файл.

Если перезагрузить Arduino. То текст запишется еще раз в файл.

Это отличное решение для сохранения показаний с датчика.

Файл на карте памяти выглядит вот так.

Файл на карте памяти выглядит вот так.

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

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Урок 13. Библиотека SD Arduino. Выводим информацию о SD карте http://portal-pk.ru/news/221-urok-13-biblioteka-sd-arduino-vyvodim-informaciyu-o-sd-karte.html Константин Portal-PK 2019-10-08T07:51:18+03:00 Сегодня в уроке начнем изучать работу с SD картой . Для этого подключим библиотеку SD . И выедим информацию о карте и файлах которые хранятся на карте памяти.

Сегодня в уроке начнем изучать работу с SD картой. Для этого подключим библиотеку SD.

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

1. Arduino UNO или Arduino NANO

2. Модуль SD карты.

3. Беспаечная макетная плата.

4. Соединительные провода.


Подключаем SD-модуль к Arduino UNO вот по такой схеме.

Подключаем SD-модуль к Arduino UNO вот по такой схеме.

SD карта подключается к шине SPI следующим образом:

  • MOSI - вывод 11
  • MISO - вывод 12
  • CLK - вывод 13
  • CS - зависит от вашей платы расширения или модуля SD карты.

SD карта подключается к шине SPI следующим образом:

Здесь, как и в других примерах Arduino, используется вывод 4.Подключение к Arduino NANO аналогично. К пинам с теме же номерами. Подключение других модулей или шилдов с SD картой может отличаться.

Подключаем Arduino к компьютеру и загружаем код:

// Подключить библиотеку SD:
#include <SPI.h>
#include <SD.h>
// Задать переменные, использующие функции вспомогательной библиотеки SD:
Sd2Card card;
SdVolume volume;
SdFile root;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() {
  // Открть последовательный порт и ждать выполнения его открытия:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // мы будем использовать код инициализации из вспомогательных библиотек,
  // так как мы только проверяем, работает ли карта!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) 
  {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } 
  else 
  {
    Serial.println("Wiring is correct and a card is present.");
  }
  // тип карты
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) 
  {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }
  // попробуем открыть "том"/"раздел" - он должен быть FAT16 или FAT32
  if (!volume.init(card)) 
  {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }
  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());
  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();
  // напечатать тип и размер первого тома FAT-типа
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);
  volumesize = volume.blocksPerCluster();    // кластеры это коллекции блоков
  volumesize *= volume.clusterCount();       // у нас будет много кластеров
  volumesize /= 2;                           // блоки SD карты всегда равны 512 байт (2 блока равны 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  // перечислить все файлы на карте с датой и размером
  root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) 
{
}

Открываем монитор порта и видим информацию о карте.

Открываем монитор порта и видим информацию о карте.

Информация включает в себя форматирование ( FAT16 или FAT32 ) и файловую структуру, а также количество свободного и используемого пространства на карте.

Один минус файлы с русским названием не отображает. Вместо русских букв одни почерки.

Один минус файлы с русским названием не отображает. Вместо русских букв одни почерки.

Это первый и самый простой пример работы с SD картой. Продолжение следует.

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

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Самодельный ЧПУ фрезерный станок на Arduino с дисплеем http://portal-pk.ru/news/220-samodelnyi-chpu-frezernyi-stanok-na-arduino-s-displeem.html Константин Portal-PK 2019-10-03T14:09:29+03:00 Кто следит за моими проектами на сайте или в группе Вконтакте. Знают, что я делаю новый ЧПУ станок на Arduino . Особенность данного станка в том, что он работает как 3D принтер . У него есть дисплей и флешка для загрузки управляющей программы. Остальное все по аналогии работы на 3D принтере . Выбираем файл и станок фрезерует . На дисплее отображается минимальную информацию о процессе.

 Для распечатки деталей ушло больше 2 кг. ABS пластика.

Разработку начал с распечатки всех комплектующих для станка. Для распечатки деталей ушло больше 2 кг. ABS пластика . За основу взял готовую конструкцию Root3 Lite CNC. Так как версия Lite. В данном проекте не все заготовок выложены в отрытый доступ. И кое что по ходу работы пришлось сделать самостоятельно.

При сборке механической части использовал алюминиевый профиль в качестве направляющих по оси X и Y. По оси Z установил линейные направляющие 8 мм, аналогичные используются в 3D принтере.

При сборке механической части использовал алюминиевый профиль в качестве направляющих по оси X и Y. По оси Z установил линейные направляющие 8 мм, аналогичные используются в 3D принтере.

Вот что понадобилось для сборки механической части:

- Шаговые двигателя Nema17 -4 шт. Подробнее ...

- Зубчатые шкивы и ремни GT2 . Подробнее ...

- Шпиндель 500W . Подробнее ...

- Полированный вал 8 мм и линейные подшипник. Подробнее ...

- Подшипники качения двух размеров. Подробнее ...

- Болты, винты, гайки, шайбы и пр.

Для управления ЧПУ изначально купил комплект Mega2560 R3 + RAMPS 1.4+ DVR8825 + 2004 LCD . Загрузил прошивку Marlin . Произвел минимальные настройки прошивки Marlin , подробнее о настройках читайте тут.

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

Купил графический дисплей lcd 12864.

При настройки прошивки марлин столкнулся с такой проблемой. Для работы по оси Y двух шаговых двигателей необходимо произвести настройки, а в интернете информации нет. Кому интересно решение читайте на форуме: Marlin подключаем 2 двигателя к оси Y или X. Назначаем вторым двигателем E1

Так как Marlin поддерживает Русский язык , перевел все пункты меню. Так же переименовал часть пунктов меню. Но пака еще встречаются слова «Печать» и «Принтер». Но это не так страшно. Со временим все подправлю.

Первый запуск выгладил вот так.

Для управления ЧПУ изначально купил комплект Mega2560 R3 + RAMPS 1.4+ DVR8825 + 2004 LCD .

Все прошло успешно. Но нашел пару багов в прошивке. Но в целом все получилось.

После чего напечатал кабель укладчики и корпус под дисплей . Уложил все провода. Электронику установив в небольшой электрический щиток. Предварительно его пришлось немного модернизировать. Сверху щитка установил вентилятор с защитной решеткой . Которую также напечатал на 3D принтере.

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

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

Работать на станке очень просто. Главное сделать и проверить управляющую программу. Которую можно сделать и проверить в онлайн сервисах о которых уже рассказывал:

Бесплатныйонлайн генератор G-Code для ЧПУ станка —MakerCAM

Онлайнпрограмма для симуляции готового G-Codeдля ЧПУ.

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

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

Станок без проблем справляется с фанерой 12 мм.

Станок без проблем справляется с фанерой 12 мм.

На фрезерном станке с ЧПУ можно делать достаточно красивые вещи .

На фрезерном станке с ЧПУ можно делать достаточно красивые вещи .

Такое не сделать на станке лазерной резки.

Такое не сделать на ЧПУ станке лазерной резки.

Такое не сделать на станке лазерной резки.

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

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Восстановление данных с жесткого диска или флешки http://portal-pk.ru/news/219-vosstanovlenie-dannyh-s-zhestkogo-diska-ili-fleshki.html Константин Portal-PK 2019-09-26T12:29:16+03:00 Сегодня не найти организацию которая бы хранила документацию в бумажном виде. Все хранится на компьютерах. Что облегчает работу с документами и распечатать можно в любой момент и в любом количестве.

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

Возможно ли восстановить данных с жестких дисков?

Если ваш офис находиться в Москве вы можете воспользоваться услугами лаборатории восстановления данных 24. Официальный сайт https://data-recovery-24.ru.

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

То вы ошибаетесь.

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

Восстановление данных с флешки, если ваше флешка

Восстановление данных с флешки, если ваше флешка не определяться компьютером или вы ее сломали, тоже не проблема для специалистов лаборатории.

Одной из сложных задач это восстановления данных с устройств продукции Apple. В лаборатории восстановления данных 24. Помогут со срочным восстановление данных c жёстких или гибридных накопителей Mac, MacBook, iMac, Mac Pro, Time Capsule . А также восстановление с ssd дисков iMac, Mac Pro, Macbook Air .

Замечательная лаборатория находиться в Москве по адресу ул. Беговая улица д. 7.

Если вам нужно срочно восстановить данные. Обращайтесь в Лабораторию восстановления данных 24. Вам обязательно помогут.

]]>
Строим график на телефоне по данным с датчика. http://portal-pk.ru/news/218-stroim-grafik-na-telefone-po-dannym-s-datchika.html Константин Portal-PK 2019-09-26T07:16:31+03:00 Показание с подключенного датчика к Arduino можно вывести на семи сегментный индикатор, на дисплей или в приложении. Как сделать самое простое приложения для вывода данных с датчика на Android телефон рассказывал тут Показание с датчика температуры и влажности на телефоне. dht11 + esp8266

Но как сделать боле наглядный вывод показаний? Можно вывести в виде графика на дисплей или на смартфон. Второй вариант сегодня и рассмотрим.

графика на дисплей или на смартфон

Для этого подключим к Arduino NANO, Bluetooth модель HC-06 и потенциометр, который будет выполнять роль датчика. Почему именно потенциометр, а не реальный датчик. С помощью потенциометра можно сделать более наглядные графики . А принцип тот же, что и с подключенным датчиком.

 подключим к Arduino NANO, Bluetooth модель HC-06 и потенциометр

Bluetooth модель HC-06 подключаем к пинам 0 и 1 по аппаратному UART порту .

Bluetooth модель HC-06 подключаем к пинам 0 и 1 по аппаратному UART порту .

Поэтому подключать к компьютеру во время работы нельзя. Как пользоваться программный UART портом рассказываю тут в середине статьи: 12.2- Дисплей Nextion урок 2. Подключаем и передаемданные на Arduino.

Если возникли вопросы пишите на форум.

Дальше грузим в Ардиино вот такой небольшой код .

int in = A0;
void setup() {
  Serial.begin(9600);
  pinMode(in,INPUT);
}
void loop() {
  byte val = map(analogRead(in),0,1024.0,0,255);    //аналоговое значение 1024 приводим к 255  
  Serial.print(val);                               //отправляем данные   
  delay(400);                                        
}

Приступим к приложению для телефона на Android . Как сделать подключение по Bluetooth к приложению я рассказывал вот в этой статье: BluetoothHC-06 и ардуино. Приложение андроид дляуправления Реле с телефона.

Приступим к приложению для телефона на Android

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

Нам понадобятся 2 невидимых компонента - это Bluetooth и часы для отчета интервалов для построения графика.

Блоки программы в mit app inventor.

Блоки программы в mit app inventor.

Создадим переменные для постройки графика.

Переменную Y берем с показаний которые поступают по Bluetooth. X увеличиваем на 1. Вся программа работает внутри счетчика часов.

Переменную Y берем с показаний которые поступают по Bluetooth. X увеличиваем на 1

Сам график строиться по 2 точкам. Предыдущая и текущая.

Сам график строиться по 2 точкам. Предыдущая и текущая.

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

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

Можно сделать сдвиг в лево. Но тут будут больше кода. Для понимания работы постарался сделать как можно проще.

В итоге у нас получаются вот такие графики.В итоге у нас получаются вот такие графики.

В добавок можно изменить стиль оформления графиков.

В добавок можно изменить стиль оформления графиков. Изменить толщину и цвет линии графика.

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

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Машинка на радиоуправлении. Arduino + nrf24l01 + пульт. http://portal-pk.ru/news/217-mashinka-na-radioupravlenii-arduino-nrf24l01-pult.html Константин Portal-PK 2019-09-19T09:01:58+03:00 Давно я уже не делал радио управляемые модели . Решил оживить свой старый проект: Радиоуправлениена Arduino + NRF24L01 + гироскоп GY-521 MPU-6050. Но не просто оживить. Но и доработать. Так как у меня есть 3D принтер . Раму для машины решил напечатать новую. Так же с кодом решил немного поработать. За это время знаний стало больше и на старые проекты уже смотрю совсем по другому. Но обо всем по порядку.

И так напечатал раму для Ардуино машинки . Фото уже выкладывал в группе в ВК. Вот что получилось:

напечатал раму для Ардуино машинки

Исходники для печати можете скачать тут.

Установил электронику: Arduino UNO, драйвер L298n, два мотор-редуктора с колесами и конечно же радио модуль nrf24l01.

Arduino UNO, драйвер L298n, два мотор-редуктора с колесами

Все комплектующие лучше покупать в Китае. Например на сайте aliexpress. Потратите в 2 раза меньше. И доставка у недорогих товаров бесплатная или очень маленькая. А если купить у одного проводка. То можно сэкономить на доставке . Для этого берем 1 товар с платной доставкой. А остальные с бесплатной. И вам все положат в одну посылку и ВСЕ отправят платной доставкой. Вот такой небольшой ЛайфХак.

Установить переключатель

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

Установил 2 бокса под аккумуляторы 18650

Установил 2 бокса под аккумуляторы 18650. Соединил их последовательно и подключил к драйверу L298n. Так как у драйвера есть понижающий стабилизатор на 5 вольт. С соответствующих разъемов мы берм 5в и подключаем Arduino UNO. Но тут есть минус. Нужно следить, чтобы аккумуляторы не пере разрядились. Иначе они выйдут из строя. Остальная часть схемы ни чем не отличается от предыдущего проекта.

Схема подключения Ардуино машинки на радио управлении

Пульт управления берем из предыдущего проекта. Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050 . Выглядит вот так.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050

Скетч тоже без изменений.

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

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

Пульт планирую переделывать

И ребенок у меня его модернизировал. Проводки пере подключал. Я конечно все восстановил. Но работает немного не так как раньше. Смотрите в видео всем отличие.


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

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[9];
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);
 pinMode(LED_BUILTIN, OUTPUT);
 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()){ 
radio.read(&msg, sizeof(msg));
} 
else
{
msg[1]=127;
msg[2]=127;}
int x= map(msg[2], 0, 255, -100, 100);
int y= map(msg[1], 0, 255, -100, 100);
 /* управляем правым мотором */
  Wheel (RightMotor, x - y);
  /* управляем левым мотором */
  Wheel (LeftMotor, x + y); 
//Serial.println(msg[1]);
}

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

int x= map(msg[2], 0, 255, -100, 100);
int y= map(msg[1], 0, 255, -100, 100);

При отсутствии связи данные параметры были равны 0. А ноль по коду мы приводим к -100. Вращаем колесо в обратную сторону. Вот от сюда и проблема.

машинка на Arduino радио модуле nrf24l01 с пультом управления

В итоге получилась вот такая машинка на Arduino радио модуле nrf24l01 с пультом управления. Который управляет машиной при наклоне пульта. Не нужно нажимать на кнопки.

Машинка и пульт управления на Ардуино

Планирую доработку пульта и машинки. Так что Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Грузоподъемность мини квадрокоптера Eachine H8 Mini http://portal-pk.ru/news/216-gruzopodemnost-mini-kvadrokoptera-eachine-h8-mini.html Константин Portal-PK 2019-09-11T13:56:41+03:00 Сегодня проверим грузоподъемность мини квадрокоптера Eachine H8 Mini . Вы наверное решили, что я впал в детства! Не совсем так. Тут в первую очередь я планирую получить знание, что сможет поднять квадрокоптер. И получиться ли на него что либо подмешать. Ну и поиграть, в нашем детстве даже машинок на пульте ДУ не было. Не говоря уже про квадрокоптер.

Подготовил я вот такие грузы

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

Квадрокоптер справился со всеми грузами до банки с канифолью. Тут начались небольшие трудности. Так как аккумулятор к тому времени уже был немного разряжен. Квадрокоптер не смог поднять 20 грамм. Но после полной зарядки данный груз поддался. Высота полета составляет всего 2-5 см над поверхностью. Но все же он летит. Если поставит новый аккумулятор. Возможно что он поднимется на 1-2 метра. Но не факт.

 Квадрокоптер не смог поднять 20 грамм.

Подробнее испытания на грузоподъемность квадрокоптера Eachine H8 Mini смотрите в видео.

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

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

Постараюсь за зиму собрать квадрокоптер. Как я люблю из говна и палок. Возможно и камеру прицеплю. Но это уже совсем другая история!

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

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
LEGO роботы. http://portal-pk.ru/news/215-lego-roboty.html Константин Portal-PK 2019-09-04T09:05:57+03:00 Конструкторы ЛЕГО одни из самых распространенных. И не зря, так как из них можно собрать здание, транспорт. Даже целые космические станции и города. Но у данных конструкторов есть один небольшой минус. Они не умеют самостоятельно двигаться и издавать звуки.

Конструкторы ЛЕГО

На самом деле это не так. Есть наборы ЛЕГО. Которые включают в себя микроконтроллер, дачки и исполнительные монизмы. Что позволяет из конструктора собрать машинку которая будет самостоятельно ездить, различные сборные приборы для изучения физики. Но это не все. Также вы можете без труда собрать автономного робота. Который будет оснащен датчиками и сенсорами, позволяющие ему самостоятельно обходить препятствие и выполнять заданные действия. При этом вы можете делать модификации, добавлять датчики, что позволит вашему LEGO роботу совершать новые действия и становиться более умным.

LEGO робот

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

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

]]>
Обзор приставки которую можно собрать за 3 т. руб. http://portal-pk.ru/news/214-obzor-pristavki-kotoruyu-mozhno-sobrat-za-3-t-rub.html Константин Portal-PK 2019-09-04T07:24:43+03:00 Для любителей игр сейчас очень большой выбор. Поиграть можно на ПК или на игровой приставке. Сегодня речь пойдет про игровую консоль которую я собрал за 3 тыс. руб .

Поиграть можно только в ретро игры. В современные игры не поиграть. Но что вы хотели за такие деньги. А если учесть что в магазине старые приставки (Sega, Playstation, Nintendo и пр.) стоят в приделах стоимость в которую обошлась мне приставка на Orange Pi Lite. То тут еще и сэкономить можно.

приставка на Orange Pi Lite

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

- Orange Pi Lite с блоком питания - 1500 руб.

- Джойстики - 980 руб.

- Вентилятор для охлаждения - 120 руб.

- Карта памяти на 16 Gb - 420 руб.

Orange Pi Lite с блоком питания

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

Корпус для приставки напечатал на 3D принтере. Скачать модель для печати можно тут. Радиаторы выпилил из старых алюминиевых радиаторов от компа.

Корпус для приставки напечатал на 3D принтере

Какую операционную систему установить на одно платный компьютер, для создания игровой приставки?

Я установил RetrOrange Pi , почему именно эта операционная систему рассказываю вот тут: Игроваяконсоль на orange pi. Выбор железа и ОС.

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

Какие приставки поддерживает и из них я играю :

  • Playstation
  • PSP
  • Sega Dreamcast
  • Sega Master System / Game Gear / Mega Drive
  • Game Boy
  • Nintendo

и пр.

Какие приставки поддерживает и из них я играю

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

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

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Обзор мини квадрокоптера. Покупал по очень низкой цене. http://portal-pk.ru/news/213-obzor-mini-kvadrokoptera-pokupal-po-ochen-nizkoi.html Константин Portal-PK 2019-09-03T07:25:04+03:00 Вы наверное знаете что я увлекаюсь разработкой проектов на Arduino, ESP8266, ESP32 и на однопалатных компьютерах. Как и все Ардуинщики мне охота собрат как можно больше интересных проектов, в том числе квадрокоптер. Но к сожалению ни на все хватает времени и средств.

я решил купить ребенку квадрокоптер

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

Коробка немного помятая, но при этом все целое.

В комплекте:

  1. Квадрокоптер.
  2. Джойстик для управления.
  3. Инструкция на английском и китайском языках.
  4. Usb зарядка.
  5. 2 запасных винта.

Eachine H8 Mini прошел сырой снег, ветер, кусты и провода.

Плохо что не заказал с дополнительными аккумуляторами. Заряда хватает всего на 5 мин. А спустя 3-4 месяца летать стал еще меньше времени.

Eachine H8 Mini прошел сырой снег, ветер, кусты и провода. Но спустя 9 месяцев он до сих пор работает. Немного разломали разъем коннектора подключения аккумулятора, перестал работать 1 синий светодиод (видать от падений в сырой снег). На корпусе появились царапины, но без них ни куда не деться. Подробнее смотрите в видео обзоре мини квадрокоптер Eachine H8 Mini.

Плюсы:

  • низкая стоимость,
  • живучесть, но это возможно мне повезло,

Минусы

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


квадрокоптер Eachine H8 Mini.

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

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

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
12.2 - Дисплей Nextion урок 2. Подключаем и передаем данные на Arduino. http://portal-pk.ru/news/212-122---displei-nextion-urok-2-podklyuchaem-i-peredaem-dannye-na.html Константин Portal-PK 2019-08-30T07:57:42+03:00 Создавать проекты, и загружать картинки в Nextion Editor мы научились в предыдущем уроке. Сегодня продолжаем осваивать работу с дисплеем Nextion, также подключим данный устройство к Arduino.

 работу с дисплеем Nextion, также подключим данный устройство к Arduino.

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

Знание которых поможет вам сэкономить время при разработке проектов:

1. Команды заканчивается тремя байтами "0xff 0xff 0xff"
2. Все команды и параметры находятся в ASCII
3. Все команды написаны строчными буквами.

Любая электроника нуждается в корпусе, исполнительном механизме. Где же заказать изготовление деталей? Для данных работ отлично подойдет ООО «М-Техника».

Основные направления деятельности компании:

  • изготовление деталей и металлических изделий различной сложности;
  • нанесение защитных и декоративных покрытий гальваническим способом на металлоизделия заказчика;
  • термообработка металлоизделий;

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

Добавляем Страницу с названием Button.


Добавляем страницу с названием Button.

Сейчас у нас есть 2 страницы. Как же нам сделать переключения между страницами. Переключает между страницами можно командой:

page Button или page 1

Переключение происходит по имени страницы или по ее индикатору. Для меня проще по имении. Вы можете использовать и по индексу страница.

Куда же добавить данную команду?
В данном уроке мы сделаем переключение со страница Logo с задержкой в 3 сек на страницу Button.
Для этого нажмем на страницу Logo и в обработчике событий загрузки страницы добавим следующие строки.

В данном уроке мы сделаем переключение со страница Logo с задержкой в 3 сек

Первая строка delay=3000 работает аналогично delay() в Arduino IDE. Задержка 3000 мс.

Все параметры и команды вы можете посмотреть в официальной документации. Здесь есть кое-какие ошибки в синтаксисе. Но описано все подробно.

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

добавим прогресс бар

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

прогресс бар, и в его свойствах добавим цикл.

Из цикла видно, что мы добавляем по 1 к свойству j0.val. Это значение заполнения школы в свойствах прогресс бара.

Прогресс бар. Отображает заполненную на заданное значение процентов линейку.

  • Sta – возможные значения: solid color и image
  • dez – направление. Возможные значения:
    • horizontal – по горизонтали
    • vertical – по вертикали
  • bco – цвет при заполнении 0%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pco – цвет при заполнении 100%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bpic – индекс картинки кнопки при заполнении в 0%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • ppic – индекс картинки при заполнении в 100%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • val – наполнение. Возможные значения: от 0 до 100.
  • x и y – координаты вставки прогресс бара
  • w и h – ширина и высота прогресс бара.

Прогресс бар не будет обновляться если не добавить переменную

doevents //обновление экрана во время цикла

Приветственная страница готово.


Оформим страницу Button.

Оформим страницу Button.

Добавим прогресс бар и кнопку с двумя состояниями.

-Кнопка с двумя положениями.

  • bco0 – цвет переключателя в положении 0. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bco1 – цвет переключателя в положении 1. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pic0 – индекс картинки переключателя в положении 0. Этот атрибут появляется при выборе значения image в атрибуте sta
  • pic1 – индекс картинки переключателя в положении 1. Этот атрибут появляется при выборе значения image в атрибуте sta
  • picс0 – индекс вырезанной картинки переключателя в положении 0. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • picс1 – индекс вырезанной переключателя в положении 1. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • val – положение переключателя. Возможные значения 0 и 1
  • x и y – координаты вставки кнопки
  • w и h – ширина и высота кнопки.

В атрибутах кнопки sta поменяем значение на image

В атрибутах кнопки sta поменяем значение на image. И подгрузим картинки в поля: pic0 и pic1.

И подгрузим картинки в поля: pic0 и pic1

В свойствах кнопки добавим такой код, который отправится на Arduino при нажатии.

В свойствах кнопки добавим такой код, который отправится на Arduino при нажатии.

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

С дизайном и подготовкой в Nextion Editor закончили. Сейчас нашу прошивку можно загрузить в дисплей.
Подключаем дисплей Nextion к Arduino NANO по схеме.

Подключаем дисплей Nextion к Arduino NANO по схеме.

Подключение к Arduino UNO аналогично.

// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 8, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 9, необходимо соединить с выводом RX дисплея
SoftwareSerial mySerial(8, 9);
byte flag = 0;
byte i = 0;
// переменная для хранения данных
String data;
// функция отправки конца команды
// команда поступающая в дисплей должна кончаться символами «0xFF0xFF0xFF»
void comandEnd() {
  for (int i = 0; i < 3; i++) {
    mySerial.write(0xff);
  }
}
// отправка на Nextion (номер экрана, название переменной) + данные
void SendInt(String dev, int data)
{
  mySerial.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  mySerial.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  mySerial.print(data);  // Отправляем данные data(данные) на Nextion
  comandEnd();
  dev = "";    // Очищаем переменную
  data = "";   // Очищаем переменную
}
void setup() {
   // открываем последовательный порт
  mySerial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
    // ждём данные от дисплея
if (mySerial.available()) {
    char inc;
    inc = mySerial.read();
    data += inc;
    if (inc == 0x0A) { //конец команды
      // если пришёло 'on'
        if (data.indexOf("on") >= 0) {
          flag = !flag;
          digitalWrite(LED_BUILTIN, flag);   // turn the LED on (HIGH is the voltage level)
          SendInt("Button.bt0.val", flag);
        }
      data = "";
    }
  }
  if (flag)
  {
    SendInt("Button.j0.val", i);    //Передаем Свойства и чифры
    i++;
    delay(20);
      if (i==100)
        {
          flag = 0;
          digitalWrite(LED_BUILTIN, flag); 
          i=0;
          SendInt("Button.j0.val", i);    //Передаем Свойства и чифры
          SendInt("Button.bt0.val", flag);    //Передаем Свойства и чифры
        }
    }
}

Скетч также подойдет для обоих плат. При желании можно использовать и на A rduino MEGA, ESP32, ESP8266 и пр.

У данной платы всего 1 аппаратный Serial Port. Будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.

// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 8, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 9, необходимо соединить с выводом RX дисплея
SoftwareSerial mySerial(8, 9);

Следующие две функции формируют и отправляют цифровые параметры на дисплей.

// функция отправки конца команды
// команда поступающая в дисплей должна кончаться символами «0xFF0xFF0xFF»
void comandEnd() {
  for (int i = 0; i < 3; i++) {
    mySerial.write(0xff);
  }
}
// отправка на Nextion (номер экрана, название переменной) + данные
void SendInt(String dev, int data)
{
  mySerial.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  mySerial.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  mySerial.print(data);  // Отправляем данные data(данные) на Nextion
  comandEnd();
  dev = "";    // Очищаем переменную
  data = "";   // Очищаем переменную
}

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

    // ждём данные от дисплея
if (mySerial.available())  // ждём данные от дисплея
{
    char inc;
    inc = mySerial.read();
    data += inc;
    if (inc == 0x0A) { //конец команды
        if (data.indexOf("on") >= 0) // если пришёло 'on'
        { 
        // делаем что-то
        }
      data = "";
    }
  }

Эта строчка отправляет состояние кнопки на дисплей. Для чего это нужно? Чтобы не получилось так, что на дисплее кнопка нажата, а светодиод не горит.

    SendInt("Button.j0.val", i);    //Передаем значение для заполнения прогрксс бара
<