Arduino. Изучаем вместе

Всё о ЧПУ (CNC). Компоненты, станки, программы.
Аватара пользователя
vovasm

Arduino. Изучаем вместе

Сообщение #71 vovasm » 13 мар 2018, 13:40

а я вот так ардуинку изучаю, тоже интрересно 3 полумоста плюс ACмотор, могу пробный рабочий скетч дать если в тему :oops:
https://youtu.be/JjxTtM1Omeo
Дети растут, игрушки дорожают...

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #72 KimIV » 01 апр 2018, 16:59

Режим пускателя

Ну-с... продолжим, тихо помолясь :jokingly:
Вы думали, светодиоды и кнопки кончились? А вот и нет :D Есть ещё один режим взаимодействия кнопок и исполнительных механизмов. Я его назвал "Режим пускателя". Это когда одной кнопкой нечто включается, а другой - выключается. Ну знаете, как в станках? Там магнитный пускатель используется... Вот и тут я решил попробовать реализовать подобное на ардуинке. Скетч получился простой.

Код: Выделить всё

void setup() {
  // Вывод 7 назначаем выходом
  pinMode(7, OUTPUT);
  // Выводы 12 и 13 назначаем входами
  pinMode(12, INPUT);
  pinMode(13, INPUT);
}

void loop() {
  if (digitalRead(12) == HIGH)
  {
    digitalWrite(7, HIGH);
  }
  if (digitalRead(13) == HIGH)
  {
    digitalWrite(7, LOW);
  }
}


Arduino. Изучаем вместе - 17_1.jpg
Arduino. Изучаем вместе - 17_2.png


На вывод 7 сажаем светодиод и назначаем его выходом. На выводы 12 и 13 подключаем кнопки и назначаем выводы входами. Затем в функции loop() считываем состояние кнопок (выводов 12 и 13), сравниваем их с высоким уровнем и взависимости от того, с какой кнопки считан высокий уровень, соответствующее значение отправляем на вывод 7. Настолько тут всё просто и функционально, что не требуются никакие защиты от ложных срабатываний кнопок и дребезга контактов.

https://youtu.be/QAjEhuTRhho
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #73 KimIV » 01 апр 2018, 19:25

Управление светодиодной линейкой с помощью потенциометра

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

Код: Выделить всё

void setup() {
  // Выводы 2 - 11 назначаем выходами
  for (int i = 2; i <= 11; i++)
  {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for (int i = 2; i <= 11; i++)
  {
    digitalWrite(i, LOW);
  }
 
  int val = analogRead(A0) * 10 / 1024;
  digitalWrite(val + 2, HIGH);
  delay(100);
}


Arduino. Изучаем вместе - 18_1.jpg
Arduino. Изучаем вместе - 18_2.png


10 светодиодов подключены к цифровым выводам со 2 по 11-ый. В скетче в функции setup() эти выводы настроены как выходы. Светодиоды будем зажигать по одному, поэтому в самом начале функции loop() тупо гасим все светодиоды. А потом анализируем уровень сигнала на аналоговом входе А0, приводим этот уровень к номеру светодиода (номеру цифрового выхода)и подаём на этот номер высокий уровень (зажигаем светодиод).

https://youtu.be/ERTn1ggD8yU
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #74 KimIV » 01 апр 2018, 19:48

Заполнение светодиодной линейки с помощью потенциометра

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

Код: Выделить всё

void setup() {
  // Выводы 2 - 11 назначаем выходами
  for (int i = 2; i <= 11; i++)
  {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for (int i = 2; i <= 11; i++)
  {
    digitalWrite(i, LOW);
  }
 
  int val = analogRead(A0) * 11 / 1024;
  for (int i = 2; i <= val + 1; i++)
  {
    digitalWrite(i, HIGH);
  }
  delay(100);
}


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

https://youtu.be/9jpDhCOFY4s
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #75 KimIV » 02 апр 2018, 17:15

Семисегментный индикатор. Отображение цифр.

Пробуем подключить вот такой семисегментный индикатор из базового комплекта кит-набора Arduino Uno R3.

Arduino. Изучаем вместе - 20_1.jpg
Arduino. Изучаем вместе - 20_2.jpg


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

Arduino. Изучаем вместе - 20_3.jpg


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

Arduino. Изучаем вместе - 20_4.png


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

https://youtu.be/f688HcU-Yog

Теперь изменим скетч таким образом, чтобы при вращении переменного резистора на индикаторе отображались цифры от 0 до 9. Но сначала нам нужно правильно заполнить побитовый массив, каждый бит, которого будет соответствовать своему сегменту индикатора или номеру цифрового выхода. Запишем соответствия цифровых выходов сегментам на основе информации из предыдущего видео. Мы знаем, что единички (высокие уровни) появлялись на выходах в определённом (заранее известном) порядке. И сегменты индикатора тоже зажигались в определённом порядке. Обозначение сегментов.

Arduino. Изучаем вместе - 20_5.gif


Первым зажигался сегмент G, следовательно именно он подключен в цифровому выходу 2. Вторым зажёгся сегмент F, значит он подключен к выходу 3. Ну и так далее запишем все соответствия выходов сегментам.

2-G, 3-F, 4-E, 5-D, 6-A, 7-B, 8-C, 9-dp

Теперь составим список соответствия цифр сегментам, из которых они будут складываться. Например, для отображения цифры 1, нужно зажечь сегменты B и C или подать высокие уровни на выходы 7 и 8. Запишем соответствия в следующем виде: арабская цифра - сегменты - номера выходов.

0 - ABCDEF - 678543
1 - BC - 78
2 - ABDEG - 67542
3 - ABCDG - 67852
4 - BCFG - 7832
5 - ACDFG - 68532
6 - ACDEFG - 685432
7 - ABC - 678
8 - ABCDEFG - 6785432
9 - ABCDFG - 678532

Для удобства заполнения битового массива расположим номера выходов в порядке возрастания и проставим биты (единички) по следующему правилу: номер выхода минус один - это номер знакоместа для единички. В остальных местах нули.

0 - 345678 - 01111110
1 - 78 - 00000110
2 - 24567 - 10111100
3 - 25678 - 10011110
4 - 2378 - 11000110
5 - 23568 - 11011010
6 - 234568 - 11111010
7 - 678 - 00001110
8 - 2345678 - 11111110
9 - 235678 - 11011110

Например, число 3 состоит из сегментов ABCDG и чтобы их зажечь, нужно подать высокие уровни на цифровые выходы 25678. Цифра 2 соответствует первому знакоместу и там ставим 1. Цифр 3 и 4 нет, поэтому на знакоместа 2 и 3 ставим 0. И т.д., в итоге числу 3 будет соответствовать следующий байт 10011110. В скетче все байты прописываем в массив numbers.

Код: Выделить всё

int pins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
byte numbers[10] = {B01111110, B00000110, B10111100, B10011110, B11000110, B11011010, B11111010, B00001110, B11111110, B11011110};

void setup() {
  for (int i = 0; i < 8; i++)
  {
    pinMode(pins[i], OUTPUT);
  }
}

void loop() {
  int val = analogRead(A0) * 10 / 1024;
  showNumber(val);
}

// Функция вывода цифры на семисегментный индикатор
void showNumber(int num) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(numbers[num], 7 - i) == HIGH)
      digitalWrite(pins[i], HIGH);
    else
      digitalWrite(pins[i], LOW);
  }
}


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

https://youtu.be/MC-Dd0BM414
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #76 KimIV » 15 май 2018, 15:36

4-ёх разрядная матрица из 7-ми сегментных индикаторов. Отображение цифр.

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

Arduino. Изучаем вместе - 21_1.png


Итак, подключаем 4-ёх разрядную матрицу из 7-ми сегментных индикаторов и пробуем вывести на неё числа, которые будем генерировать всё тем же переменным резистором, подключенным к аналоговому входу А0. Вот сама матрица.

Arduino. Изучаем вместе - 21_2.jpg
Arduino. Изучаем вместе - 21_3.jpg
Arduino. Изучаем вместе - 21_4.jpg


Как видим, у неё всего лишь 12 выводов. А у одноразрядного индикатора их было 9. Так-то 10, но два были электрически замкнуты между собой, поэтому задействованных в схеме выводов было только 9. Если логически рассуждать, то у 4-ёх разрядного индикатора должно быть 4 * 9 = 36 выводов, но в реальности их всего лишь 12. В чём же дело? А дело в том, что одноимённые сегменты разных разрядов подключены к одним и тем же выводам. Таким образом на сегменты и точку тратиться лишь 8 выводов и плюс 4 (по количеству разрядов) общих выводов. Итого 12 выводов. Вот схема 4-ёх разрядной матрицы из вышеуказанной книги.

Arduino. Изучаем вместе - 21_5.png


Собираем схему на рис.7.2 из книги "Практическая энциклопедия ARDUINO".

Arduino. Изучаем вместе - 21_6.jpg
Arduino. Изучаем вместе - 21_7.jpg


Берём готовый скетч из листинга 7.2 и немного дорабатываем:

1. Исправляем опечатку в строке:

Код: Выделить всё

int pindigits[4]={2,8,ll,12};


на

Код: Выделить всё

int pindigits[4] = {2, 12, 11, 8};


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

2. Убираем генерацию числа кнопкой секундомера и вставляем чтение аналогового входа А0 из предыдущего скетча.

Код: Выделить всё

number = analogRead(A0) * 10 / 1024;


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

3. Функцию showNumber(int num) тоже используем из предыдущего скетча, т.к. выставление десятичной точки нам не нужно. Готовый код скетча в архиве ZIP прикреплю к сообщению. Кому надо, скачивайте.

В строке

Код: Выделить всё

number = analogRead(A0) * 10 / 1024;


я менял число 10 на 20, 30 и 50. После каждой замены загружал скетч в микроконтроллер, крутил потенциометр, смотрел отображаемые числа на индикаторе и снимал видео.

https://youtu.be/sMimPNpPoVM

При 10 на индикаторе последовательно отображались цифры от 0 до 9 в первом разряде.
При 20 во втором разряде уже стала появляться единичка, то есть пошли числа от 0 до 19.
При 30 отображались числа от 0 до 29.
При 50 я ожидал увидеть числа от 0 до 49, но меня ожидал сюрприз. Числа отобразились только от 0 до 31, а дальше пошла какая-то белиберда.
Чтобы понять в чём дело, я добавил в скетч строки отладки (подробнее об отладке скетчей тут):

1. В конце функции setup()

Код: Выделить всё

Serial.begin(9600);


2. В функции loop() после строки чтения значения аналогового входа А0

Код: Выделить всё

  Serial.print("number=");
  Serial.println(number, DEC);


И это позволило в мониторе порта увидеть следующую картину

Arduino. Изучаем вместе - 21_8.png


Хмм... вот это сюрприз! После числа 31 идёт отрицательное число 30 и далее увеличение до -14. Разбор выявил казус с делением и после удаления операций умножения и деления всё стало нормально. С аналогового вывода стали читаться числа от 0 до 1023.

https://youtu.be/9KuZTvBKBAo

А если всё же надо ограничить считываемые с аналогового вывода значения, то строку

Код: Выделить всё

number = analogRead(A0) * 50 / 1024;


нужно разбить на две

Код: Выделить всё

  number = analogRead(A0);
  number = number * 50 / 1024;


И всё будет в порядке! Я снял видео отображения чисел с ограничением до 255. Кстати, в реале цифры на индикаторе лучше различимы, чем на камере.

https://youtu.be/12opoZ9DqmY
Вложения
21_KimIV_4x7Seg.zip
Исходный код скетча. Окончательный вариант.
(886 байт) 12 скачиваний
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Akondr

Arduino. Изучаем вместе

Сообщение #77 Akondr » 16 май 2018, 11:53

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

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #78 KimIV » 16 май 2018, 12:21

Akondr писал(а):Источник цитаты Игорь, а для чего дисплей через резисторы подключил?

В книжке, которую я уже два раза упоминал, матрица семисегментных индикаторов подключается через резисторы сопротивлением 510 Ом. Я подключил через 220 Ом, какие были в комплекте кит-набора.
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.

Аватара пользователя
Akondr

Arduino. Изучаем вместе

Сообщение #79 Akondr » 16 май 2018, 12:27

Игорь, нашел ответ на свой вопрос на просторах интернета:
Токоограничительные резисторы могут присутствовать в схеме, а могут и не присутствовать. Все зависит от напряжения питания, которое подается на индикатор и технических характеристик индикаторов. Если, к примеру, напряжение подаваемое на сегменты равно 5 вольтам, а они рассчитаны на рабочее напряжение 2 вольта, то токоограничительные резисторы ставить необходимо (чтобы ограничить ток через них для повышенного напряжении питания и не сжечь не только индикатор, но и порт микроконтроллера).
Рассчитать номинал токоограничительных резисторов очень легко, по формуле дедушки Ома.
К примеру, характеристики индикатора следующие (берем из даташита):
— рабочее напряжение — 2 вольта
— рабочий ток — 10 мА (=0,01 А)
— напряжение питания 5 вольт
Формула для расчета:
R= U/I (все значения в этой формуле должны быть в Омах, Вольтах и Амперах)
R= (напряжение питания — рабочее напряжение)/рабочий ток
R= (5-2)/0.01 = 300 Ом

Отправлено спустя 12 минут 44 секунды:
Глянул даташит 5641АН:
Arduino. Изучаем вместе - Безымянный.jpg
Питание Min 5V. Выходит резисторы не нужны... :)

Аватара пользователя
Автор темы
KimIV

Arduino. Изучаем вместе

Сообщение #80 KimIV » 16 май 2018, 13:42

Саша, светодиоды питаются током, а не напряжением. Поэтому токоограничительные резисторы нужны! ;)
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.


Вернуться в «Системы ЧПУ»