Проект выходного дня: Имперский марш на сервоприводах и MSP430

от автора

Ладно. Все началось с того, что я заказал сервы. Думал что это одна большая, а оказалось, что 5, но маленьких. Нужный мне груз они не потянули, но раз что-то есть в закромах родины, значит это что-то надо применить.

Сначала я хотел сделать из них часы, идущие в обратную сторону, но ошибся в задержках и получил звук «Зз-Зз-Зз-ЗЗЗЗЗ», который показался мне интересным.
Дальше были выходные и неспешное ковыряние в коде, который претерпел несколько изменений, был потерян и переписан для MSP430 и Wiring вместо BASCOM(потому что мне было ленивее набирать программу второй раз, нежели написать ее на другом языке), и в итоге принял такой вид:
ОСТОРОЖНО! Быдлокод!

#include <Servo.h> //Подключаем бибилотеку Servo myservo1;//Определяем имена Servo myservo2;     int x = 0; //Разные переменные     int y = 0;     int z = 0;     int w = 0;     int g = 0;         int h = 0;     int q = 0;      void setup() { myservo1.attach(7, 600, 800); //Определяем порты серв и параметры(длительность паузы и импульса) управления myservo2.attach(8, 600, 800); myservo1.write(0); //Устанавливаем в ноль myservo2.write(0); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(RED_LED, OUTPUT); digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, LOW); }  void loop() {   delay(2000);//Ждем перед началом 2 секунды, чтоб не смазывать начало  q=song(80,40,0);//Начинаем звучать q=song(80,40,0);//Формат такой: q=song(-80,40,0);//Первая цифра - относительный угол поворота, причем надо следить, чтоб он был не больше 180 и не меньше 0  q=song(-50,30,-50);//Вторая - длительность паузы. Нормализованная - поворот на 30 градусов и 30 единиц паузы равны по времени q=song(-5,15,0); //Третья - Угол поворота второй сервы,все тоже самое что и у первой. q=song(-80,20,0);  q=song(-10,10,-10); q=song(-10,10,0); q=song(-100,70,0);  q=song(-80,32,-80); q=song(-40,32,-80); q=song(-80,32,-80);  q=song(-70,32,0); q=song(-10,10,0); q=song(-100,20,-80);  q=song(-70,40,0); q=song(-10,10,0); q=song(-100,20,-80);  q=song(-70,40,0); q=song(-10,10,0); q=song(-100,50,0);  q=song(-80,32,-80); q=song(-40,32,0); q=song(-10,10,0);  q=song(-80,32,-80); q=song(-40,32,0); q=song(-10,10,0);  q=song(-80,32,-80); q=song(-40,40,-40); q=song(-10,10,0);  q=song(-10,8,-10); q=song(-10,8,-10); q=song(-10,32,-10);  delay(2000000);  }  int song(int y, int z, int g){     x=x+y; //Превращаем относительный угол поворота в абсолютный     h=h+g;//Тоже самое для второй сервы     w=(abs(y)*3.75+z*10/1.6)/2;//Нормализуем длительность паузы. Сначала вычисляем время, необходимое для поворота сервопривода на заданный угол, потом добавляем к этому значению время паузы      if (g != 0) // надо двигать одну или две сервы?     {     myservo2.write(h);     digitalWrite(GREEN_LED, HIGH);     myservo1.write(x);     digitalWrite(RED_LED, HIGH);     }     else     {     myservo1.write(x);     digitalWrite(RED_LED, HIGH);     }     g=0;     delay(w);//Две задержки - чтоб светодиоды вспыхивали красиво     digitalWrite(GREEN_LED, LOW);     digitalWrite(RED_LED, LOW);     delay(w);     } 

Фотка для отвлечения внимания и разбавления текста:

Так как у меня не получилось подобрать на слух, я пошел на хитрость — скачал midi, открыл в редакторе и замерил длительность звучания нот и пауз. Те ноты, чья тональность отличалась слишком сильно — озвучивала вторая сервомашинка, она имеет другой звук.
Еще одна фотка:

Так как сервы питаются от стабилизатора платы, коэффициенты рассчитаны на напряжение 3в, при бОльшем — будет различаться длительность пауз, из-за увеличения скорости движения.

И, наконец, самое интересное — видео.

ссылка на оригинал статьи http://habrahabr.ru/post/156455/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *