Страница 12 из 17

Азбука Ардуино

Добавлено: Чт янв 23, 2020 12:17 am
BazilVV
MOT писал(а):
Ср янв 22, 2020 11:58 pm
Не вдаваясь в подробности низкоуровнего программирования, завязка идёт и на процессор у которого есть регистры
:shock: наверно это я не пойму.

Азбука Ардуино

Добавлено: Чт янв 23, 2020 12:46 am
Andrey.I
MOT писал(а):
Ср янв 22, 2020 11:58 pm
завязка идёт и на процессор у которого есть регистры (внутренняя память).
То есть, у нашего процессора только 16 "фиговин" :) ( не знаю как назвать) в которые записывается переменная? Поэтому двойка в 15 ой степени+ 0?
Наверное сморозил? :) Но понять хочется.

Азбука Ардуино

Добавлено: Чт янв 23, 2020 9:38 am
SmartAvit
Сегодня сделаю ещё один урок по переменным будем разбираться с типами тогда станет понятней.

Азбука Ардуино

Добавлено: Чт янв 23, 2020 12:46 pm
MOT
Andrey.I писал(а):
Чт янв 23, 2020 12:46 am
...
Наверное сморозил? :) Но понять хочется.
Андрей, настолько глубоко не нужно знать вопрос, мы же не на Ассемблере скетчи пишем. Вам просто необходимо запомнить типы данных и их пределы. За остальное пусть железяка думает :)
Владимир - автор ветки, он ведёт уроки. Не буду влазить. Тем более, если начну описывать азы, то тут не одна страница выйдет :) Вам только мозги запудрю.

Азбука Ардуино

Добавлено: Чт янв 23, 2020 1:37 pm
SmartAvit
К переменным мы вернемся чуть позже, а сейчас давайте рассмотрим саму плату Arduino.

У каждой платы Arduino есть свой набор выводов, которые также могут называться порты, выходы, пины (pin).

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

Они все подписаны, с одной стороны идут цифровые выводы Digital (PWM~) от 0 до 13 и GND (минус, общий) те выводы которые обозначены значком тильда ~ работают в режиме ШИМ, с другой стороны аналоговые выводы от A0 до A5 и GND (2 шт.), плюс питание 5V, 3.3V.


Изображение

Обратите внимание, что аналоговые выводы на самом деле являются цифровыми и их можно использовать в таком качестве, если вам не хватило стандартных выводов от 0 до 13.

Поэтому аналоговые выводы можно представлять как 14, 15, 16, 17, 18, 19 вместо A0, A1, A2, A3, A4, A5.

Это используется при создании массива пинов (массивы рассмотрим позже) , так проще перечислять все пины от 0 до 19.

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

int Red_led = 13;
int Green_led = 14; // Вместо int Green_led = А0;

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

У плат Arduino Nano и Arduino Mini есть также аналоговые выводы A6 и A7, которые можно использовать только как аналоговые, но не как цифровые, поэтому у Arduino Nano – 22 порта, а у Arduino Uno – всего 20 портов.

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

Вдобавок, аналоговые выводы могут принимать аналоговые сигналы - диапазон плавно изменяющего напряжения от 0 до 5 вольт с маленьким шагом. Аналоговые порты могут работать как цифровые.

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

Можно программно управлять цифровыми выводами - подавать напряжение - 5 вольт и не подавать напряжение – около 0 вольт. А также можно считывать информацию - подаётся ли напряжение на pin или нет.

Для построения макета на Arduino удобно на выходных пинах использовать светодиоды с гасящим резистором 100 Ом, а на входных кнопки для эмуляции цифрового сигнала и потенциометр на 10 кОм для эмуляции аналогового сигнала от 0 до 5 В.

Старайтесь не использовать выводы 0 и 1. Они используются для приёма и передачи данных по USB. Выводы 2 и 3 используются в прерываниях. Конечно, в простых проектах это не принципиально, но лучше сразу привыкнуть к правильному порядку.

Таблица приоритетов использования пинов выглядит следующим образом: D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D3, D2, D1, D0. Пины D3, D2, D1, D0 используйте только в том случае если все остальные уже заняты. При этом при загрузки скетча от пинов D1, D0 нужно отключить провода.

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

Азбука Ардуино

Добавлено: Чт янв 23, 2020 11:30 pm
SmartAvit
И снова переменные

Рассмотрим этот вопрос на отвлеченном примере

У Вас есть маленькая коробочка в которую помещается только одна радиодеталь резистор

Маленькая коробочка, есть переменная boolean и в ней или есть деталь значение true, 1 или нет детали значение false, 0 при этом вы можете как положить в нее 1 деталь так и вынуть её.

Переменная Boolean самая маленькая переменная если Вам в процессе работы нужно только два значения true – false, 1- 0 , а этого достаточно для большинства цифровых датчиков то Вы используете ее.

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

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

Следующая коробочка уже побольше byte в нее помещается от 0 до 255 деталей или для Arduino числа от 0 до 255

Эту переменную я использую например для назначения портов Arduino которых всего 20 для UNO и 22 для Nano

Пример

byte Red_led = 13; // назначаем пину 13 имя Red_led

если Вы напишите

boolean Red_led = 13; // то по факту вы назначите пину 1 имя Red_led (так как в маленькую коробочку может поместится всего одна деталь)

Следующая переменная char в неё помещаются числа от – 128 до +127
Почему в byte и char помещается только 256 чисел, потому что при объявлении переменных byte и char в памяти выделяется 8 бит а 2 в 8 степени и есть 256, но в случае с byte это только положительная область, а в случае с переменной char это числа от – 128 до +127

Следующая переменная (коробочка) еще больше word эта переменная занимает 16 бит, 2 в 16 степени и может принимать значение от 0 до 65535(деталей) , вы можете положить в эту переменную и число 10 (в эту коробочку 10 деталей) но зачем для этого есть переменная byte (коробочка по меньше)

Следующая переменная которой мы пользовались ранее int может присваивать значения от – 32 768 до + 32 767 но она также занимает 16 бит, 2 в 16 степени (очень большая)

Следующая переменная ещё больше long 32 бит, 2 в 32 степени (огромная как от старого лампового телевизора и хранить в ней один резистор это безумие) можно присвоить числа от 0 до 4 294 967 295

Переменная float занимает тоже 32 бита и ей присваиваются числа с плавающей запятой от – 3,4028235 Е38 до + 3,4028234 Е38

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

Если еще остались вопросы по этой теме и переменным задавайте.

Азбука Ардуино

Добавлено: Пт янв 24, 2020 12:07 am
Andrey.I
SmartAvit,
Владимир, прекрасное объяснение! У Вас педагогический талант!

Азбука Ардуино

Добавлено: Пт янв 24, 2020 6:41 am
SmartAvit
Andrey.I писал(а):
Пт янв 24, 2020 12:07 am
SmartAvit,
Владимир, прекрасное объяснение! У Вас педагогический талант!
Спасибо большое.
Тема переменные довольно сложная для понимания постарался найти более удобоваримый формат для раскрытия.
Надеюсь теперь не осталось непонимания по этой тематике.

Азбука Ардуино

Добавлено: Пт янв 24, 2020 9:38 am
Pionka
Скоро можно будет и по теме "Азбука Ардуино", на основе этой ветки форума, делать Записную Книжку. :) Отличные и понятные объяснения !!!

Азбука Ардуино

Добавлено: Пт янв 24, 2020 11:41 am
alex-551
Да, записная книжка, или пособие будет нужна. Жду пока придёт плата с Китая. Когда придёт, придётся всё начинать с начала.

Азбука Ардуино

Добавлено: Пт янв 24, 2020 5:34 pm
BazilVV
SmartAvit писал(а):
Чт янв 23, 2020 11:30 pm
Если еще остались вопросы по этой теме и переменным задавайте.
С ящичками понятно :) , но с переменной int и Period еще посидеть нужно, написать алгоритм и по нему скетч, воплотить на плате, за вычисления молчу. Интуитивно, был правильный ответ, но отверг его из-за дроби, нужно еще пару примеров, чтоб подумать.

Азбука Ардуино

Добавлено: Пт янв 24, 2020 7:28 pm
Andrey.I
BazilVV писал(а):
Пт янв 24, 2020 5:34 pm
нужно еще пару примеров, чтоб подумать.
Василий Васильевич, я сам на днях задачку придумал для себя, :) написал от 0 до 30 все числа в двоичной системе, наошибался конечно, привыкнуть нужно, лист перевернул ещё раз написал. Выборочно из двоичной в десятичную попереводил. Пригодиться-не пригодится, а вспомнить. мозги потренировать. Глядишь и ещё что всплывёт, о чём и думать забыл. Скетчи например покрутить можно сильно меняя параметры, а перед этим подумать как устройство работать будет. Тоже делал. Думаю полезно для понимания и практика и к новому привыкаем. :)

Азбука Ардуино

Добавлено: Пт янв 24, 2020 10:01 pm
BazilVV
Andrey.I писал(а):
Пт янв 24, 2020 7:28 pm
написал от 0 до 30 все числа в двоичной системе
Прикольно, я сейчас не подглядываю никуда, попробую:
0001, 0010, 0011,0100,0101,0110,0111,1000,1001,1010 это 1-10
10100 - 20; 11110 - 30; вроде так, когда то интересовался.

Азбука Ардуино

Добавлено: Вт янв 28, 2020 10:09 am
SmartAvit
Надеюсь по теме переменные вопросов не осталось тогда рассмотрим вопрос оптимизации кода при помощи оператора #define.

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

int ledRed = 13; // Мы установили светодиод красного цвета на pin 13 и присвоили переменной int (занимает 16 бит, 2 в 16 степени, очень много) значение ledRed

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

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

Например если у Вас красный светодиод припаян к pin13 и менять его присоединение не планируется то в место:

int ledRed = 13; // расходуется 16 бит памяти

мы запишем так:

#define ledRed 13 // память не расходуется, мы как бы говорим компилятору, при компиляции заменить ledRed на 13 и во всем коде при компиляции (перевод в двоичный код) значение ledRed будет заменено на 13.

и дальше мы продолжаем код:

pinMode(ledRed, OUTPUT);

Внимание, если значение переменной int ledRed = 13; изменяется, придется использовать переменную. Но если нет - можно ресурсы c экономить.

А теперь попробуйте самостоятельно изменить код при помощи оператора #define и посмотрите на сколько изменится объём занимаемой памяти.

Обратите внимание на синтаксис написания #define Red_led 13

int Red_led = 13; // Присвоим переменной Red_led значение 13
int Green_led = 11; // Присвоим переменной Green _led значение 11
int Yellow_led = 9; // Присвоим переменной Yellow _led значение 9
int Period = 100; // Присвоим переменной Period значение 100
void setup()
{
pinMode(Red_led, OUTPUT); // Присвоим пину Red_led (переменная Red_led = 13) функц выход
pinMode(Green_led, OUTPUT); // Присвоим пину Green _led назначение OUTPUT выход
pinMode(Yellow_led, OUTPUT); // Присвоим пину Yellow _led назначение OUTPUT выход
}
void loop()
{
digitalWrite(Red_led, HIGH); delay(Period*10);
digitalWrite(Green_led, HIGH); delay(Period*10);
digitalWrite(Yellow_led, HIGH); delay(Period*10);
digitalWrite(Red_led, LOW); delay(Period*5);
digitalWrite(Green_led, LOW); delay(Period*5);
digitalWrite(Yellow_led, LOW); delay(Period*5);
}

Азбука Ардуино

Добавлено: Ср янв 29, 2020 12:32 am
Andrey.I
SmartAvit писал(а):
Вт янв 28, 2020 10:09 am
А теперь попробуйте самостоятельно изменить код при помощи оператора #define и посмотрите на сколько изменится объём занимаемой памяти.
Владимир, не поменялось ничего. Как было один в один так и осталось, а по идее с глобальных переменных должно освободится 8 байт.
Скетч использует 1068 байт (3%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
скетч под спойлером
#define Red_led 13
#define Green_led 11
#define Yellow_led 9
#define Period 100
void setup()
{
pinMode(Red_led, OUTPUT);
pinMode(Green_led, OUTPUT);
pinMode(Yellow_led, OUTPUT);
}
void loop()
{
digitalWrite(Red_led, HIGH); delay(Period*10);
digitalWrite(Green_led, HIGH); delay(Period*10);
digitalWrite(Yellow_led, HIGH); delay(Period*10);
digitalWrite(Red_led, LOW); delay(Period*5);
digitalWrite(Green_led, LOW); delay(Period*5);
digitalWrite(Yellow_led, LOW); delay(Period*5);
}