Практика 02
Управление сервомотором в Arduino
1. Написать программу для Arduino, под управлением которой
сервомотор вращается последовательно по часовой стрелке,
а затем против часовой стрелки. В рабочем цикле программы
позиция сервомотора изменяется по формуле:
pos = pos + step, или pos+ = step
где pos - текущая позиция, угол поворота, сервомотора, в градусах,
step - шаг изменения угла поворота.
Измените нижеприведенный пример прошивки так, чтобы
1) вращение сервомотора происходило в пределах от 45 до 135 градусов;
2) по часовой стрелке сервомотор вращался с больше скоростью, чем
в противоположном направлении
Задание 2. Напишите программу на Arduino для управления светодиодом с помощью функции millis(). При составлении программы следует рассматривать управляемую систему как конечный автомат, состояния которого задаются различными значениями флага.
3. Написать программу для Arduino, которая одновременно управляет поворотом сервомотора и скоростью мигания светодиода: при увеличении угла поворота от 0 до 180 градусов частота мигания светодиода увеличивается, а при уменьшении от 180 градусов до 0 частота уменьшается.
Пример 1
#define LED_PIN 13 #define STATE_LED_ON 1 #define STATE_LED_OFF 2 int timeLedOn = 200; int timeLedOff = 700; unsigned long time1; unsigned long time2; int flag = STATE_LED_ON; void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); Serial.println("OK! millis + flag + mutex+ semafor is ready..."); Serial.println("v0.1 31.03.2017"); time1 = millis(); } void loop() { time2 = millis(); if ((flag == STATE_LED_ON)&&((time2 - time1) > timeLedOn)) { flag = STATE_LED_OFF; time1 = time2; digitalWrite(LED_PIN, LOW); } if ((flag == STATE_LED_OFF)&&((time2 - time1) > timeLedOff)) { flag = STATE_LED_ON; time1 = time2; digitalWrite(LED_PIN, HIGH); } Serial.print("time1 = "); Serial.println(time1); Serial.print("flag = "); Serial.println(flag); }
Пример 2
#include <Servo.h> #define SERVO_PIN 9 #define MAX_POS 180 #define MIN_POS 0 int pos = 0; int h = 1; // Step of servo position. Servo myservo; void setup() { Serial.begin(9600); myservo.attach(SERVO_PIN); } void loop() { pos += h; if (pos > MAX_POS) { pos = MAX_POS; h = -1; } if (pos < MIN_POS) { pos = MIN_POS; h = 1; } myservo.write(pos); delay(15); }