Файл: С чего начинаются роботы. О проекте Arduino для школьников (В.Н. Гололобов, 2011).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1232
Скачиваний: 3
Приложение А. О языке программирования Arduino
analogRead (pin)
Считывает значение из заданного аналогового входа (pin) с 10-битовым разрешением. Эта функция работает только на аналоговых портах (0-5). Результирующее целое значение находится в диапазоне от 0 до 1023.
value = analogRead (pin); // задаѐм значение 'value' равным 'pin'
Примечание: Аналоговые выводы не похожи на цифровые, и нет необходимости предварительно объявлять их как INPUT или OUTPUT (если только вы не планируете использовать их в качестве цифровых портов 14-18).
аналоговый ввод-вывод | 143
Приложение А. О языке программирования Arduino
analogWtite (pin, value)
Записывает псевдо-аналоговое значение, используя схему с широтно-импульсной модуляцией (PWM), на выходной вывод, помеченный как PWM. На новом модуле
Arduino с ATmega168 (328), эта функция работает на выводах 3, 5, 6, 9, 10 и 11.
Старый модуль Arduino c ATmega8 поддерживает только выводы 9, 10 и 11. Значение может быть задано как переменная или константа в диапазоне 0-255.
analogWrite (pin, value); // записываем ‘value’ в аналоговый ‘pin’
Значение 0 генерирует устойчивое напряжение 0 вольт на выходе заданного вывода; значение 255 генерирует 5 вольт на выходе заданного вывода. Для значений между 0 и 255 вывод быстро переходит от 0 к 5 вольтам — чем больше значение, тем чаще вывод в состоянии HIGH (5 вольт). Например, при значении 64 вывод будет в 0 три четверти времени, а в состоянии 5 вольт одну четверть; при значении 128 половину времени будет вывод будет в 0, а половину в 5 вольт; при значении 192 четверть времени вывод будет в 0 и три четверти в 5 вольт.
Поскольку эта функция схемная (встроенного модуля), вывод будет генерировать устойчивый сигнал после вызова analogWrite в фоновом режиме, пока не будет следующего вызова analogWrite (или вызова digitalRead или digitalWrite на тот же вывод).
Примечание: Аналоговые выводы, не такие как цифровые, и не требуют предварительной декларации их как INPUT или OUTPUT.
Следующий пример читает аналоговое значение с входного аналогового вывода, конвертирует значение делением на 4 и выводит PWM сигнал на PWM вывод:
int led = 10; |
// LED с резистором на выводе 10 |
int pin = 0; |
// потенциометр на аналоговом выводе 0 |
int value; |
// переменная для чтения |
void setup() {} |
// setap не нужен |
void loop() |
|
{ |
|
value = analogRead (pin); |
// задаѐт ‘value’ равной ‘pin’ |
value /= 4; |
// конвертируем 0 – 1023 в 0 – 255 |
analogWrite (led, value); |
// выводим PWM сигнал на LED |
} |
аналоговый ввод-вывод | 144
Приложение А. О языке программирования Arduino
время и математика
delay (ms)
Приостанавливает вашу программу на заданное время (в миллисекундах), где 1000 равно 1 секунде.
delay (1000); // ждѐм одну секунду
millis()
Возвращает число миллисекунд, как unsigned long, с момента старта программы в модуле Arduino.
value = millis(); // задаѐт ‘value’ равной millis()
Примечание: Это число будет переполняться (сбрасываться в ноль), после, примерно, 9 часов.
min (x, y)
Вычисляется минимум двух чисел любого типа данных и возвращает меньшее число.
value = min (value, 100); // устанавливает 'value' в наименьшее из
//‘value’ и 100, обеспечивая, что
//оно никогда не превысит 100
max (x, y)
Вычисляется максимум двух чисел любого типа данных и возвращает большее число.
value = max (value, 100); // устанавливает 'value' в наибольшее из
//‘value’ и 100, обеспечивая, что
//оно никогда не меньше 100
время и математика | 145
Приложение А. О языке программирования Arduino
случайные числа
randomSeed (seed)
Устанавливает значение, или начальное число, в качестве начальной точки функции random().
randomSeed (value); // задаѐт ‘value’ как начальное значение random
Поскольку Arduino не может создавать действительно случайных чисел, randomSeed позволяет вам поместить переменную, константу или другую функцию в функцию random, что помогает генерировать более случайные «random» числа. Есть множество разных начальных чисел, или функций, которые могут быть использованы в этой функции, включая millis(), или даже analogRead() для чтения электрических шумов через аналоговый вывод.
random (max) random (min, max)
Функция random позволяет вам вернуть псевдослучайное число в диапазоне, заданном значениями min и max.
value = random (100, 200); // задаѐт 'value' случайным
// числом между 100 и 200
Примечание: Используйте это после использования функции randomSeed().
Следующий пример создаѐт случайное число между 0 и 255 и выводит PWM сигнал на PWM вывод, равный случайному значению:
int randNumber; // переменная для хранения случайного значения int led = 10; // LED с резистором на выводе 10
void setup() {} // setup не нужен
void loop () |
|
{ |
|
randomSeed (millis()); |
// задаѐт millis() начальным числом |
randNumber = random (255); |
// случайное число из 0 – 255 |
analogWrite (led, randNumber); |
// вывод PWM сигнала |
delay (500); |
// пауза в полсекунды |
} |
случайные числа | 146
Приложение А. О языке программирования Arduino
последовательный обмен
Serial.begin (rate)
Открывает последовательный порт и задаѐт скорость для последовательной передачи данных. Типичная скорость обмена для компьютерной коммуникации — 9600, хотя поддерживаются и другие скорости.
void setup ()
{
Serial.begin (9600); // открывает последовательный порт // задаѐт скорость обмена 9600
}
Примечание: При использовании последовательного обмена, выводы 0 (RX) и 1 (TX) не могут использоваться одновременно как цифровые.
Serial.println (data)
Передаѐт данные в последовательный порт, сопровождая автоматическим возвратом каретки и переходом на новую строку. Команда такая же, что и Serial.print(), но легче для последующего чтения на данных в терминале.
Serial.println (analogValue); |
// отправляет значение |
// ‘analogValue’ |
Примечание: За дальнейшей информацией о различных изменениях
Serial.println() и Serial.print() обратитесь на сайт Arduino.
Следующий простой пример читает аналоговый вывод 0 и отсылает эти данные на компьютер каждую секунду.
void setup () |
|
{ |
|
Serial.begin (9600); |
// задаѐм скорость 9600 bps |
} |
|
void loop () |
|
{ |
|
Serial.println (analogRead(0); |
// шлѐм аналоговое значение |
delay (1000); |
// пауза 1 секунда |
} |
последовательный обмен | 147
Приложение А. О языке программирования Arduino
приложение
приложение | 148
Приложение А. О языке программирования Arduino
цифровой выход
Это базовая программа «hello world», используемая для включения и выключения чего-нибудь. В этом примере светодиод подключѐн к выводу 13 и мигает каждую секунду. Резистор в данном случае может быть опущен, поскольку на 13-м порту Arduino уже есть встроенный резистор.
int ledPin = 13; |
// LED на цифровом выводе 13 |
void setup () |
// запускается один раз |
{ |
|
pinMode (ledPin, OUTPUT); |
// устанавливаем вывод 13 на выход |
} |
|
void loop () |
// запускается вновь и вновь |
{ |
|
digitalWrite (ledPin, HIGH); |
// включаем LED |
delay (1000); |
// пауза 1 секунда |
digitalWrite (ledPin, LOW); |
// выключаем LED |
delay (1000); |
// пауза 1 секунда |
} |
приложение | 149
Приложение А. О языке программирования Arduino
цифровой ввод
Это простейшая форма ввода с двумя возможными состояниями: включено или выключено. В примере считывается простой переключатель или кнопка, подключѐнная к выводу 2. Когда выключатель замкнут, входной вывод читается как HIGH и включает светодиод.
int ledPin = 13; |
// выходной вывод для LED |
int inPin = 2; |
// входной вывод (для выключателя) |
void setup () |
|
{ |
|
pinMode (ledPin, OUTPUT); |
// объявляем LED как выход |
pinMode (inPin, INPUT); |
// объявляем выключатель как вход |
} |
|
void loop () |
|
{ |
|
if (digitalRead (inPin) == HIGH) |
// проверяем, вход HIGH? |
{ |
|
digitalWrite (ledPin, HIGH); |
// включаем LED |
delay (1000); |
// пауза 1 секунда |
digitalWrite (ledPin, LOW); |
// выключаем LED |
delay (1000); |
// пауза 1 секунда |
} |
|
} |
приложение | 150
Приложение А. О языке программирования Arduino
сильноточный выход
Иногда возникает необходимость в управлении более, чем 40 мА от Arduino. В этом случае может использоваться транзистор MOSFET для коммутации сильноточной нагрузки. В следующем примере MOSFET быстро включается и выключается 5 раз в секунду.
Примечание: Схема показывает мотор и диод защиты, но другие, не индуктивные, нагрузки могут включаться без диода.
int outPin = 5; // выходной вывод для MOSFET
void setup () |
|
{ |
|
pinMode (outPin, OUTPUT); |
// задаѐм вывод 5 как выход |
} |
|
void loop () |
|
{ |
|
for (int i=0; i<5; i++) // цикл 5 раз |
|
{ |
|
digitalWrite (outPin, HIGH); |
// включаем MOSFET |
delay (250); |
// пауза в ¼ секунды |
digitalWrite (outPin, LOW); |
// выключаем MOSFET |
delay (250); |
// пауза в ¼ секунды |
} |
|
delay (1000); |
// пауза 1 секунда |
} |
приложение | 151
Приложение А. О языке программирования Arduino
pwm выход
Широтно-импульсная модуляция (PWM) — это способ имитировать аналоговый выход с помощью импульсного сигнала. Это можно использовать для гашения и увеличения яркости светодиода или позже для управления сервомотором. Следующий пример медленно увеличивает яркость и гасит LED, используя цикл for.
int ledPin = 9; |
// PWM вывод для LED |
void setup () {} |
// setup не нужен |
void loop () |
|
{ |
|
for (int i=0; i<=255; i++) |
// растущее значение для i |
{ |
|
analogWrite (ledPin, i); // устанавливаем уровень яркости для i |
|
delay (100); |
// пауза 100 миллисекунд |
} |
|
for (int i=255; i>=0; i--) |
// уменьшающееся значение для i |
{ |
|
analogWrite (ledPin, i); // устанавливаем уровень яркости для i |
|
delay (100); |
// пауза 100 миллисекунд |
} |
|
} |
|
приложение | 152
Приложение А. О языке программирования Arduino
вход с потенциометра
Использование потенциометра и одного из аналоговых портов Arduino (аналогоцифрового преобразователя (ADC)) позволяет читать аналоговые значения в диапазоне 0-1023. Следующий пример показывает использование потенциометра для управления временем мигания светодиода LED.
int potPin = 0; |
// входной вывод для потенциометра |
int ledPin = 13; |
// выходной вывод для LED |
void setup () |
|
{ |
|
pinMode (ledPin, OUTPUT); |
// объявляем ‘ledPin’ как OUTPUT |
} |
|
void loop () |
|
{ |
|
digitalWrite (ledPin, HIGH); |
// включаем 'ledPin’ |
delay (analogRead(potPin)); |
// пауза |
digitalWrite (ledPin, LOW); |
// выключаем ‘ledPin’ |
delay (analogRead (potPin)); |
// пауза |
} |
приложение | 153