Ниже предложены некоторые задания, в порядке усложнения, но если у вас есть более интересные идеи не упускайте шанс их попробовать! Полезные ссылки • Arduino презентация на Русском (English) • Arduino примеры Оглавление (также является списком упражнений): Serial.println: Hello World Подключетие светодиода к питанию Мигающий светодиод Переменный резистор и сенсор расстояния Яркость светодиода в зависимости от расстоаяния Часть 1: Используйте analogWrite чтобы заставить светодиод менять яркость. Часть 2: Используйте сенсор расстояния чтобы менять яркость Контроль Сервомотора EXPERT ONLY: Read values from accelerometer or gyro over I2C
и исправить возможные неполадки. Если у вас не установлено Arduino, скачать и установить его можно здесь. (или можете попросить у меня flashку с файлами). Правильные ссылки внутри тёмнозелёного прямоугольника (справа или внизу). Пожалуйста НЕ ставьте Hourly Builds! До того как нажать Upload, не забудьте подключить Arduino и выбрать правильную плату и порт. Это находится в меню Tools (подпункты Board и Port). Возможные варианты: • Arduino Nano • Arduino/Genuino Micro • (чтото ещё) Пользователям Windows 10: Если после после подключения Arduino Nano у вас не показываются никакие порты, попробуйте установить драйвер с этой ссылки (это драйвер с сайта производителя USBtoserial чипов). Сама программа: void setup() { Serial.begin(115200); } void loop() { Serial.println("Hello, world "); delay(500); }
убедиться что он работает. Не использует микроконтроллер. Внимание: светодиод нельзя подключать к питанию напрямую: он может сгореть! Его нужно подключать через резистор. Подключите: +5V > [RESISTOR] > [LED] > Ground Учтите что: • У светодиода есть полярность и он будет гореть только в о одном направлении. Если он не горит, попробуйте поменять полярность. • Не важно с какой "стороны" подключать резистор: можно подключить как и со стороны земли, так и со стороны +5V. Мигающий светодиод Подключите: [Любой цифровой pin: 2 13] > [RESISTOR] > [LED] > Ground Напишите программу используя "pinMode", "digitalWrite", "delay". Пример: void setup() { pinMode(2, OUTPUT); } void loop() { digitalWrite(2, HIGH); delay(200); digitalWrite(2, LOW); delay(500); }
к +5V и GND. Подсоедините средний контакт к любому аналоговому входу (A0, A1, etc). Используйте "analogRead" чтобы считать значения. void setup() { Serial.begin(115200); } void loop() { unsigned short val = analogRead(A0); Serial.println(val); delay(500); } На заметку: • Tools > Serial Monitor показывает что Serial.println печатает • Tools > Serial Plotter рисует эти значения на графике • analogRead возвращает значения от 0 до 1023 Сенсор расстояния: похоже на переменный резистор. Подсоедините сторону с ЧЁРНОЙ проволокой к GND а сторону с КРАСНОЙ проволокой к +5V. Просьба не путать полярность! Иначе сенсор или конденсатор могут сгореть.
чтобы заставить светодиод менять яркость. Можете использовать этот пример: void setup() { pinMode(3, OUTPUT); } byte brightness = 0; // 0 to 255 void loop() { analogWrite(3, brightness); brightness++; delay(2); } Внимание, не все контакты поддерживают PWM. Те что поддерживают: • Arduino Nano: 3, 5, 6, 9, 10, 11. • Arduino Micro: 3, 5, 6, 9, 10, 11, 13 Часть 2: Используйте сенсор расстояния чтобы менять яркость Должно быть очевидно как это сделать на основе предыдущих примеров. Учтите что analogRead возвращает значения от 0 до 1023 (10 бит), тогда как analogWrite принимает значения от 0 до 256. Чтобы преобразовать значение, можно использовать функцию map, или просто обычное деление. Также, значение возвращаемое сенсором расстояния может содержать шум вблизи нуля (т.е. возвращать не 0, а небольшое произвольное значение). Чтобы избавиться от этого эффекта, можете добавить код типа: short val = analogRead(A0); if (val < 20) { val = 0; } или: short val = analogRead(A0); val = 20; if (val < 0) { val = 0;
или просто препрограммированного движения. Подключение сервомотора У сервомотора 3 провода подключения: • Питание (красный) (+6V) • Ground (чёрный) • Сигнал (подключается к выходу микроконтроллера) Внимание, сервомотор потребляет достаточно большой ток, поэтому следует подключать его к отдельному питанию (чтобы не напрягать USB порт вашего компьютера). Используете прилагаемые батарейки (в держателях). При этом Ground (минус) отдельного питания должет быть подключёт к Ground Arduino. Смотрите схему на картинке Примеры Пример 1: основан на Arduino Sweep Example #include <Servo.h> Servo myservo; void setup() { // Starts outputting PWM on a given pin. myservo.attach(2); } void loop() { // 'pos' is a position in degrees: for (int pos = 0; pos <= 180; pos += 1) { myservo.write(pos); // waits 15ms for the servo to reach the position delay(15); } for (int pos = 180; pos >= 0; pos = 1) { myservo.write(pos); delay(15);
самостоятельное изучение спецификаций акселеромера и и написание кода для того чтобы с ним работать. У меня есть одна плата с акселерометром и гироскопом с которой вы можете попробовать поработать. • Плата с акселерометром и гироскопом. Там внизу имеется ссылки на datasheets для акселерометра (ADXL345) и гироскопа (ITG3200). • Используйте 3.3V для питиния, не 5V! • Можете посмотреть (непоказанные) I2C слайды из презентации. • Используйте Arduino Wire library. Там также указывается какие пины нужно использовать для I2C SDA/SCL (Nano <> Uno; Micro <> Leonardo) Подсказки: • Сначала попробуйте прочитать какойнибудь регистр: там есть регистры с фиксированными значениями: которые можно использовать чтобы протестировать программу. • Вам нужно будет записать специальные значения в регистры (смотрите datasheet) прежде чем акселерометр начнёт выдавать значения. Примеры кода. Эти примеры из того кода что я написал, так что если хотите, можете структурировать код по своему. void setup() { Wire.begin(); ...... } // Write 1 byte at the given address. // You can always write several subsequent registers by adding more 'Wire.write' calls inline void i2c_write1(byte address, byte reg, byte value1) { Wire.beginTransmission(address); Wire.write(reg); Wire.write(value1); Wire.endTransmission(); } // Begin I2C read. I made it a separate function, so it can be // used for both singlebyte and mutlibyte reads: inline void i2c_request_read(byte address, byte reg, byte num_bytes) {