Практика 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); }