3223д, 4223д, 3922д. Основы робототехники

Лабораторные работы 

1. Сделать схему с одним мигающим светодиодом. Периодичность мигания одна секунда. (2 балла)

2. Сделать схему с четырьмя светодиодами. Светодиоды включаются и выключаются посоледовательно. Сначала включается и выключается первый свотодиод, потом второй... Время горения одного светодиода одна секунда. (2 балла)

3. Сделать схему с одной кнопкой и одним светодиодом. Нажатие на кнопку должно включать светодиод, отжатие кнопки выключает светодиод. (2 балла)

4. Сделать схему с тремя кнопками и тремя светодиодами. Нажатие кнопки включает свой светодиод. Отпускание кнопки гасит соотвествующий светодиод (4 балла).

5. Создайте схему с потенциометром и серво. При вращении ручки потенциометра пропорционально вращается вал серво. (4 балла)

6. Создайте схему с серво. Вал серво вращается на 180 градусов, пауза 1 секунда, вращается в положение 0 градусов, пауза 1 секунда. Все повторяется в бесконечном цикле. (2 балла)

7. Создайте схему с ультразвуковым датчиком расстояния. Схема измеряет расстояние и передает его на ноутбук. (2 балла)

8. Создайте схему с ультразвуковым датчиком расстояния и светодиодом. Если на расстоянии меньше 40 см появляется припятствие светодиод загоряется, если исчезает светодио гаснет. (4 балла)

9. Создайте схему с датчиком влажности DHT22. Выведите на "монитор порта" показания влажности и температуры. Используйте в качестве основы статью: https://arduino-diy.com/arduino-datchiki-temperatury-i-vlazhnosti-DHT11-i-DHT22 (8 баллов). Вероятно вам придется самостоятельно установить библиотеку для поддержки работы датчика. Именно из-за этой работы задача имеет такой относительно высокий балл.

10. Создайте схему с LED-матрицей 8×8. 
а) Выведите на матрицу какую-нибудь произвольную графическую фигуру. (4 балла)
б) Выведите на матрицу текст, например "Мы молодцы". Подготовьте объяснение работы программы. (15 баллов)
Используйте в качестве основы статью: https://developer.alexanderklimov.ru/arduino/ledmatrix.php

Схема подключения матрицы: https://robocraft.ru/arduino/782

11. Создайте схему с дисплеем LCD Дисплей 1602A.
а) Выведете на экран дисплея текст "Привет мир" (На английском (10 баллов) или русском языке (12 баллов)). При выборе русского языка нужно самостоятельно разобраться как подключить библиотеку с кириллицей.
б) Выведите на экрана бегущую строку "Фамилия круче всех" (15 баллов) 

Используйте в качестве основы статью: https://arduino-diy.com/arduino-zhidkokristallicheskiy-displey-LCD-1602 


12. Создайте схему с шаговым двигателем 28BYJ-48 и драйвером драйвер ULN2003. Напишите программу, которая заставит двигатель циклично поворачивать вал двигателя на два оборота по часовой стрелке и два оборота против часовой стрелки. (6 баллов)

Используйте в качестве основы статью: https://роботехника18.рф/шаговый-двигатель-ардуино/
Существует возможность управлять данным двигателем с помощью специальной библиотеки, разбиритесь с ее использованием самостоятельно. Подробности в статье: https://arduinomaster.ru/motor-dvigatel-privod/shagovye-dvigateli-i-motory-arduino/


ВТОРОЙ СЕМЕСТР


Задача 12.02.2026.1 (5 баллов)

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

Объясните решение.

Решение

const int LED_PIN = 8;
const int BUTTON_PIN = 6;

long timeNajatiya=0;
boolean buttonPressed = false;
boolean lostButtonPresses = false;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // Внутренняя подтяжка к VCC
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN);
 
  if (buttonState == LOW) {
    buttonPressed = true;
  }
  else {buttonPressed = false;}


  if ((buttonPressed==true)&&(lostButtonPresses==false)){
    timeNajatiya = millis();
    }


  if ((millis()-timeNajatiya>1000)&&(buttonPressed==true)) {digitalWrite(LED_PIN, HIGH);}
    else {
      digitalWrite(LED_PIN, LOW);
      }
 
  lostButtonPresses = buttonPressed;
}

Дополнение для проекта "Робот повторяющий движения"

Сохраните код в файл robot.py

import cv2
import mediapipe as mp
import time
import serial
import math

mp_drawing = mp.solutions.drawing_utils
drawSpecific = mp.solutions.pose
mp_pose = mp.solutions.pose

ser = serial.Serial('COM4', 9600)
rukaA = 0
rukaB = 0

def send_numbers(x, y):
    # Формируем строку в формате X:Y
    message = f"{x}:{y}\n"
    # Отправляем данные
    ser.write(message.encode())
   
def degress(x1,y1,x2,y2):
    alpha = math.atan2(x2 - x1, y2 - y1)  # результат в радианах
    alpha_degrees = abs(math.degrees(alpha))   # перевод в градусы
    return alpha_degrees


def distanceCalculate(p1, p2):
    """p1 and p2 in format (x1,y1) and (x2,y2) tuples"""
    dis = ((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2) ** 0.5
    return dis


start = True
count = 0

# For webcam input:
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

with mp_pose.Pose(
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5,
    model_complexity=2) as pose:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      # If loading a video, use 'break' instead of 'continue'.
 
     
      continue

    # Converting the from BGR to RGB
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
   
    image.flags.writeable = False
    results = pose.process(image)
    image.flags.writeable = True
   
    # Converting back the RGB image to BGR
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    image_height, image_width, _ = image.shape
    if results.pose_landmarks != None:
       
        nosePoint = (int(results.pose_landmarks.landmark[0].x*image_width), int(results.pose_landmarks.landmark[0].y*image_height), results.pose_landmarks.landmark[0].visibility)
        leftWrist = (int(results.pose_landmarks.landmark[15].x*image_width), int(results.pose_landmarks.landmark[15].y*image_height), results.pose_landmarks.landmark[15].visibility)
        rightWrist = (int(results.pose_landmarks.landmark[16].x*image_width), int(results.pose_landmarks.landmark[16].y*image_height), results.pose_landmarks.landmark[16].visibility)
        leftShoulder = (int(results.pose_landmarks.landmark[11].x*image_width), int(results.pose_landmarks.landmark[11].y*image_height), results.pose_landmarks.landmark[11].visibility)
        rightShoulder = (int(results.pose_landmarks.landmark[12].x*image_width), int(results.pose_landmarks.landmark[12].y*image_height), results.pose_landmarks.landmark[12].visibility)
       
        rukaA=degress(int(results.pose_landmarks.landmark[15].x*image_width), int(results.pose_landmarks.landmark[15].y*image_height),int(results.pose_landmarks.landmark[11].x*image_width), int(results.pose_landmarks.landmark[11].y*image_height))
        rukaA = 180-rukaA
        rukaB=degress(int(results.pose_landmarks.landmark[16].x*image_width), int(results.pose_landmarks.landmark[16].y*image_height),int(results.pose_landmarks.landmark[12].x*image_width), int(results.pose_landmarks.landmark[12].y*image_height))
        rukaB = 180-rukaB
       
        send_numbers (rukaA,rukaB)
       
        if nosePoint[2] > 0.5 and rightWrist[2] > 0.5:   # проверка на наличие
          if nosePoint[1] <= rightWrist[1]:
              start = True # при опускании руки переводит счетчик в режим нового ожидания
          elif start  and nosePoint[1] > rightWrist[1]:
              count += 1
              start = False

    # Drawing the Facial Landmarks
    mp_drawing.draw_landmarks(
        image,
        results.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        mp_drawing.DrawingSpec(   # точки
          color=(255,255,255),
          thickness=3,
          circle_radius=2
        ),
        mp_drawing.DrawingSpec(  # линии соединения
          color=(0,255,255),
          thickness=2,
          circle_radius=1
        )
    )
 
    text = f"Правая рука поднята столько раз: {count}"
    image = cv2.putText(image, text, (50, 50), fontFace=cv2.FONT_HERSHEY_COMPLEX,
                         fontScale=1, color=(255, 0, 0), thickness=1, lineType=cv2.LINE_AA)
   
    text = f"Угол наклона руки А: {rukaA}"
    image = cv2.putText(image, text, (50, 150), fontFace=cv2.FONT_HERSHEY_COMPLEX,
                         fontScale=1, color=(255, 0, 0), thickness=1, lineType=cv2.LINE_AA)
    text = f"Угол наклона руки B: {rukaB}"
    image = cv2.putText(image, text, (50, 200), fontFace=cv2.FONT_HERSHEY_COMPLEX,
                         fontScale=1, color=(255, 0, 0), thickness=1, lineType=cv2.LINE_AA)

    cv2.imshow('MediaPipe Pose', image)
   
   
   
    if cv2.waitKey(1) & 0xFF == ord("q"):
      break
   
cap.release()
cv2.destroyAllWindows()

 

Задача 12.02.2026.2 (7 баллов) 

Измените решение задачи 12.02.2026.1 таким образом чтобы она обрабатывала две кнопки и два сыветодиода - каждая кнопка включает свой светодиод. 


Задача 23.04.2026 (10 баллов)

Доработать текст программы. Так чтобы передаваемые два числа управляли углом поворота сервомотора.

Числа передаются через монитор порта в формате:   100:200

Текст программы:


String inputString = "";      // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);

    String leftCh = "";
    String rightCh = "";
    String result = "";

    for (int i=0; i<inputString.length();i++){

      if ((inputString[i]!=':')&&(inputString[i]!='\n'))
         {result = result + inputString [i];};
      Serial.println(result);

      if (inputString[i]==':')
      {
        leftCh = result;
        result = "";
        //Serial.println("!");
      }

      if (inputString[i]=='\n')
      {
        rightCh = result;
        result = "";
      }
    }

    Serial.println("Левый мотор - "  +leftCh);
    Serial.println("Правый мотор - " +rightCh);

    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {

    char inChar = (char)Serial.read();

    inputString = inputString + inChar;

    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}




Решение задач региональной олимпиады по робототехнике

Баллы за решение - олимпиадный балл *1,5

  • Страница кафедры информационных технологий (поиск по слову "олимпиад"): https://vk.com/altgpu_it
  • Олимпиадные заданий для номинации Arduino за несколько лет:https://vk.com/wall-224575752_99



Информационные материалы для лабораторных работ по Arduino

Курс «Arduino для начинающих» (Все необходимые знания для большинства лабораторных)

Arduino для начинающих. Урок 1. Мигающий светодиод

Подключение кнопки на Arduino

Подключение потенциометр

Управление сервоприводом

Подключение датчика температуры и влажности DHT11 и DHT22

Подключение пьезоэлемента

Подключение датчика влажности DHT11 


Уроки Ардуино (Arduino) для начинающих. 


Состав наборы Arduino для лабораторных работы





Информационные ресурсы

Дополнительные материалы

Необходимое программное обеспечение


Прилржение. Коды программ


Решение задачи №2026.4 "Ладошки"

#include <Servo.h>

const int buttonPin = 2;  // the number of the pushbutton pin

Servo myservo;

int buttonState = 0;  // variable for reading the pushbutton status
int randomValue = 0;
int gameState = 0;
int g = 0;

void setup() {
  pinMode(buttonPin, INPUT);
  myservo.attach(9);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if ((buttonState == HIGH)&&(gameState==0))
      {randomValue = random (10000); delay(randomValue);gameState=1;}
  if ((buttonState == HIGH)&&(gameState==1)) {gameState=2;}
  if ((gameState==1)&&(g<180)) {g=g+1; myservo.write(g); delay(2);}
  if (g==180) {
    digitalWrite(8, HIGH);
    newStartGame;
    }//Загорается сигнал Робот победил
  if (gameState==2) {digitalWrite(7, HIGH);newStartGame;}//Загорается сигнал Человек победил
}

void newStartGame()
{
    delay (2000);
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    g = 0;
    gameState = 0;
}

Комментариев нет:

Отправить комментарий