<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Урок 8. Сервопривод. Аналоговые часы]]></title><description><![CDATA[<h1>Привет! Сегодня мы научимся управлять серво при помощи M5Stack</h1>
<p dir="auto">Сервопривод (от лат. servus — слуга, помощник, раб), или следящий привод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне. Сервопривод имеет три провода: + питания, - питания и провод данных. Для того, чтобы повернуть сервопривод на нужный угол, необходимо отправить по проводу данных импульс необходимой длительности, как показано на рисунке 1.</p>
<p dir="auto"><img src="https://pp.userapi.com/c830709/v830709284/510be/FjFjcaaApbg.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 1. Временные графики управляющего импульса</p>
<h2><strong>Перечень компонентов для урока:</strong></h2>
<ul>
<li>
<ol>
<li>M5Stack;</li>
</ol>
</li>
<li>
<ol start="2">
<li>кабель USB-C из стандартного набора;</li>
</ol>
</li>
<li>
<ol start="3">
<li>цветные провода из стандартного набора;</li>
</ol>
</li>
<li>
<ol start="4">
<li>сервопривод со стрелкой. Модель SG90;</li>
</ol>
</li>
<li>
<ol start="5">
<li>фотобумага 10 х 15 см;</li>
</ol>
</li>
<li>
<ol start="6">
<li>лак для ногтей;</li>
</ol>
</li>
<li>
<ol start="7">
<li>термоклей;</li>
</ol>
</li>
<li>
<ol start="8">
<li>доска для монтажа.</li>
</ol>
</li>
</ul>
<h2>Цель урока:</h2>
<p dir="auto">Сделаем аналоговые часы с часовой стрелкой. Настройка времени будет производиться при помощи встроенных кнопок и экрана M5Stack. Каждый час будет звучать звук.</p>
<h3>Шаг 1. Распакуйте Ваш сервопривод (рис. 1.1);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bab3/vwfKi4JW2zc.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 1.1. Новый набор с сервоприводом</p>
<h3>Шаг 2. Оставьте только выделенные компоненты, а остальные уберите в сторону (рис. 2);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840230/v840230284/75558/CgHHEjD_1RI.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 2. Выбор необходимых компонентов сервопривода</p>
<h3>Шаг 3. Возьмите лак для ногтей (рис. 3) и покрасьте стрелку (рис. 4);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bac5/EZ1oJdxBUEk.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 3. Лак для ногтей и стрелка сервопривода</p>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bace/uvFOPgFpLWk.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 4. Покраска стрелки</p>
<h3>Шаг 4. Распечатайте на обычном принтере на фотобумаге размером 10 х 15 см циферблат для наших часов (файл для печати прилагается разделе Загрузки), затем сделайте отверстие при помощи отвёртки (рис. 5);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bad7/0BMC_RaZq1M.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 5. Подготовка циферблата</p>
<h3>Шаг 5. При помощи термоклея аккуратно прикрепите циферблат к корпусу сервопривода (рис. 6);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bae0/rArBSpcXjME.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 6. Крепление циферблата к корпусу серво</p>
<h3>Шаг 6. Аналогичным образом закрепите конструкцию на деревянной платформе и установите стрелку (рис. 7);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bae9/cvtI6H576D8.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 7. Установка и сборка часов</p>
<h3>Шаг 7. Используйте цветные провода для подключения (рис. 8);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4baf2/YwfV85rv9N4.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 8. Подключение серво к устройству</p>
<h3>Шаг 8. Подключите провода к необходимым контактам, как показано на рисунке 9;</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bafb/8S3bvjg_jSQ.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 9. Подключение провода данных к G5, провода + питания к 5V, провода - питания к GND</p>
<h3>Шаг 9. Подключите устройство к компьютеру при помощи кабеля USB-C (рис. 10);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bb04/GEA8ri-CSTM.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 10. Подключение к ПК</p>
<h3>Шаг 10. Создайте новый проект в Arduino IDE и напишите код:</h3>
<pre><code>#include &lt;M5Stack.h&gt;

int servoPin = 5;
// default time
int H = 0;
int M = 59;
int clockTable[12][2] = { // calibrate clock table
  {28, 157}, {157, 130}, {130, 103}, {103, 79},
  {76, 52}, {49, 28}, {28, 9}, {9, 130},
  {130, 103}, {103, 79}, {79, 52}, {52, 28}
};
int S = 0;
unsigned long cMls;
unsigned long pMls = 0;
bool dots = false;

int servoPulse(int angleDegrees)
{
  int pulseWidth = map(angleDegrees, 0, 180, 544, 2400);
  return pulseWidth;
}

void servoSet(int oldAngle, int newAngle) {
  int pulseWidth;
  if (oldAngle == newAngle)
  { 
return;
  }
  else if (oldAngle &lt; newAngle)
  {
for (int i = oldAngle; i &lt;= newAngle; i++){
  pulseWidth = servoPulse(i);
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pulseWidth);  
  digitalWrite(servoPin, LOW);
  delayMicroseconds(20000 - pulseWidth);   
}
  }
  else if (oldAngle &gt; newAngle)
  {
for (int i = oldAngle; i &gt;= newAngle; i--){
  pulseWidth = servoPulse(i);
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pulseWidth);   
  digitalWrite(servoPin, LOW);
  delayMicroseconds(20000 - pulseWidth);
}
  }
}

void setH(bool readOnly = false) {
  if (!readOnly) H++;
  if (H &gt; 11) H = 0;
  M5.Lcd.fillRect(80, 110, 70, 42, 0x00);
  M5.Lcd.setTextColor(0xfbe4);
  M5.Lcd.setTextSize(6);
  M5.Lcd.setCursor(80, 110);
  servoSet(clockTable[H][0], clockTable[H][1]);
  if ((H &lt; 10) &amp;&amp; (H != 0)) M5.Lcd.print(0);
  M5.Lcd.print(((H == 0) ? 12 : H));
}

void setM(bool manual = false, bool readOnly = false) {
  if (!readOnly) M++;
  if (M &gt; 59)
  {
M = 0;
if (!manual)
{
setH();
M5.Speaker.tone(660);
delay(50);
M5.Speaker.mute();
M5.Speaker.tone(440);
delay(50);
M5.Speaker.mute();
M5.Speaker.tone(820);
delay(50);
M5.Speaker.mute();
  }
  }
  M5.Lcd.fillRect(180, 110, 70, 42, 0x00);
  M5.Lcd.setTextColor(0xfbe4);
  M5.Lcd.setTextSize(6);
  M5.Lcd.setCursor(180, 110);
  if (M &lt; 10) M5.Lcd.print(0);
  M5.Lcd.print(M);
}

void setS() {
  S++;
  if (S &gt; 59)
  {
S = 0;
setM();
  }
  if (dots)
  {
M5.Lcd.fillRect(150, 110, 29, 42, 0x00);
  }
  else
  {
M5.Lcd.setTextColor(0xfbe4);
M5.Lcd.setTextSize(6);
M5.Lcd.setCursor(150, 110);
M5.Lcd.print(":");
  }
  dots = !dots;
}

void setup() {
  m5.begin();
  pinMode(servoPin, OUTPUT);
  M5.Lcd.setBrightness(200);

  M5.Lcd.setTextColor(0xffff);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(65, 20);
  M5.Lcd.print("Servo Clock");
  
  M5.Lcd.setTextColor(0x7bef);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(55, 60);
  M5.Lcd.print("please, setup time");

  M5.Lcd.setCursor(60, 215);
  M5.Lcd.printf("H");

  M5.Lcd.setCursor(250, 215);
  M5.Lcd.printf("M");

  setH(true);
  setM(true, true);
}

void loop() {
  cMls = millis();
  if (M5.BtnA.wasPressed()) setH();
  if (M5.BtnC.wasPressed()) setM(true);
  if ((cMls - pMls) &gt; 1000)
  {
pMls = cMls;
setS();
  }
  m5.update();
}
</code></pre>
<h3>Шаг 11. Загрузите скетч в устройство (рис. 10.1);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c824200/v824200361/944b3/u5enVZRq4UA.jpg" alt="" class=" img-fluid img-markdown" /></p>
<h3>Шаг 12. После загрузки скетча устройство перезагрузится, а на экране появится меню;</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bb0d/NK9HMInw7Pw.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 11. Меню на дисплее</p>
<h3>Шаг 13. Установите время при помощи кнопок H и M и ожидайте наступления следующего часа (рис. 12);</h3>
<p dir="auto"><img src="https://pp.userapi.com/c840323/v840323316/4bb16/8B3mBvs7jN8.jpg" alt="" class=" img-fluid img-markdown" /><br />
Рисунок 12. Часы в работе</p>
<h2>Загрузки</h2>
<p dir="auto">Видео с демонстрацией работы скачать можно здесь <a href="https://yadi.sk/i/sOEpVp7r3RkPoY" target="_blank" rel="noopener noreferrer nofollow ugc">https://yadi.sk/i/sOEpVp7r3RkPoY</a></p>
<p dir="auto">Скетч можно скачать здесь <a href="https://yadi.sk/d/1kpt9gH33Rm49M" target="_blank" rel="noopener noreferrer nofollow ugc">https://yadi.sk/d/1kpt9gH33Rm49M</a></p>
<p dir="auto">Файл для печати циферблата можно скачать здесь <a href="https://yadi.sk/d/Dr7CWpnW3Rm53V" target="_blank" rel="noopener noreferrer nofollow ugc">https://yadi.sk/d/Dr7CWpnW3Rm53V</a></p>
]]></description><link>https://community.m5stack.com/topic/76/урок-8-сервопривод-аналоговые-часы</link><generator>RSS for Node</generator><lastBuildDate>Sat, 27 Jun 2026 19:27:44 GMT</lastBuildDate><atom:link href="https://community.m5stack.com/topic/76.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Jan 2018 04:34:40 GMT</pubDate><ttl>60</ttl></channel></rss>