Проект «Управляемый ИК пультом лифт для трехэтажной парковки Лего»

09.01.2012
By

Реализация школьного  проекта по теме «Занимательная наука» вылилась в данную тему.

Кратко: с пульта ИК (клавиши 1, 2 и 3) управляется шаговый мотор, который поднимает и опускает лифт на соответствующий этаж. Для реализации проекта выбрана плата Freeduino, ИК приемник TSOP1736, драйвер шагового двигателя L293D, шаговый мотор от старого принтера Canon i550, и много-много деталей Лего.

Вот что получилось в итоге:

ЛегоЛифт на базе freeduino

Схема:

Схема решения для ЛегоЛифта

и собственно скетч программы

//Проект управления лифтом на парковке Лего (2012)

// Подключение библиотеки шагового двигателя
#include <Stepper.h>

// Библиотека инфракрасного приемника
#include <IRremote.h>

// количество шагов мотора (получается простым способом деления
//360 градусов на угол (документация к мотору), на который поворачивается
//мотор за один шаг. В случае использования двигателя (Mitsumi) 48 шагов
#define STEPS 48

// Контакт приема сигнала от ИК приенмника TSOP1736 на плате arduino/freeduino
int RECV_PIN = 7;

// переменная значения этажа (на этом этаже находится лифт)
// перед включением лифт должен находиться на первом этаже!!!
int V_FLOOR;

// переменные которые указывают количество оборотов мотора по 360 градусов
// необходимого для достижения заданного этажа от первого и от второго соответственно.
int V_SECOND_FLOOR = 6;
int V_THIRD_FLOOR = 6;

// создает класс шагового двигателя и объявляет какими ножками Ардуино
// он будет управляться (двигатель биполярный – 4 вывода)
Stepper stepper(STEPS, 8, 9, 10, 11);

//Создаем класс ИК приемника
IRrecv irrecv(RECV_PIN);

// Результат декодирования помещаем в переменную
decode_results results;

void setup()
{
// Установление скорости оборотов двигателя в оборотах в минуту (RPM)
// движок работал в диапазоне 5-400 вполне стабильно.
stepper.setSpeed(60);

Serial.begin(9600); // инициируем порт для наблюдения результатов
irrecv.enableIRIn(); // запускаем прием ИК
V_FLOOR = 1; //лифт на первом этаже
}

void loop()
{

if (irrecv.decode(&results)) { // если получен какой либо код с ИК приемника
// выводим числовое значение нажатой клавиши на пульте ИК и текущее значение
//этажа на компьютер (через монитор компорта)
Serial.println(results.value);
Serial.println(V_FLOOR);
if (results.value == 16748655) // номер 1 на пульте
{
Serial.println(«едем на первый этаж»);
if (V_FLOOR == 1) // лифр на первом этаже
{
//ничего не делаем – лифт уже на первом этаже
}
if (V_FLOOR == 2) // лифт на втором этаже
{
// заставляем вращать мотор заданное значение оборотов от первого до второго
//этажа но в обратную сторону – знак минус перед переменной V_SECOND_FLOOR
stepper.step(-V_SECOND_FLOOR*STEPS);
V_FLOOR = 1;
}
if (V_FLOOR == 3) //лифт на третьем этаже
{
// заставляем вращать мотор заданное значение оборотов от первого до третьего
//этажа но в обратную сторону – знак минус перед суммой переменных V_SECOND_FLOOR и
// V_THIRD_FLOOR
stepper.step(-(V_SECOND_FLOOR + V_THIRD_FLOOR)*STEPS);
V_FLOOR = 1;
}
delay(1000);
}

if (results.value == 16758855) // номер 2 на пульте
{
Serial.println(«едем на второй этаж»);
if (V_FLOOR == 1) // лифр на первом этаже
{
stepper.step(V_SECOND_FLOOR*STEPS);
V_FLOOR = 2;
}
if (V_FLOOR == 2) // лифт на втором этаже
{
//ничего не делаем – лифт уже на втором этаже
}
if (V_FLOOR == 3) //лифт на третьем этаже
{
stepper.step(-V_THIRD_FLOOR*STEPS);
V_FLOOR = 2;
}
delay(1000);
}
if (results.value == 16775175) // номер 3 на пульте
{
Serial.println(«едем на третий этаж»);
if (V_FLOOR == 1) // лифр на первом этаже
{
stepper.step((V_SECOND_FLOOR + V_THIRD_FLOOR)*STEPS);
V_FLOOR = 3;
}
if (V_FLOOR == 2) // лифт на втором этаже
{
stepper.step(V_THIRD_FLOOR*STEPS);
V_FLOOR = 3;
}
if (V_FLOOR == 3) //лифт на третьем этаже
{
//ничего не делаем – лифт уже на третьем этаже
}
delay(1000);
}

// для ручной корректровки лифта

if (results.value == 16734375) // стрелка вправо на пульте
{
Serial.println(«полкруга вперед»);
// один полный круг вперед
stepper.step(0.5*STEPS);
delay(100);
}

if (results.value == 16740495) // стрелка влево на пульте
{
Serial.println(«Полкруга назад»);
// один полный круг назад
stepper.step(-0.5*STEPS);
delay(100);
}

irrecv.resume(); // Ожидаем получение следующей переменной
}
}

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