Переключение слайдов Arduino+ИК Приемник+ИК Пульт+PowerPoint+Немного свободного времени

3 Май
2012

Всем привет!
Начну с предыстории.

Предыстория


Недавно на паре мне поручили подготовить выступление (презентацию) на тему «Контроллеры». Презентацию сделал. Получилась скучная и неинтересная: классификация, функции, языки программирования и т.д. и т.п. Поэтому решил добавить немного практики и реализовать пару простых функций с помощью Arduino UNO. Хоть это и не промышленный контроллер, но для выступления сойдет. Теперь о реализации.

Реализация


Требуется реализовать 4 простых функции в Power Point по нажатию кнопок на пульте: запустить слайд-шоу, закрыть слайд-шоу, следующий слайд, предыдущий слайд. Схема работы выглядит примерно так: нажимаем кнопку на пульте; ардуино принимает сигнал и отправляет данные на COM порт; приложение на компе опрашивает COM порт и взаимодействует с Power Point.

Схема

Схема простенькая: питание, земля, выход.
image

Скетч

В скетче используется библиотека IRremote
#include <IRremote.h>

int RECV_PIN = 7;
int old_result;
int new_result;

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    new_result = results.value;
    if(new_result != old_result){
      //завершаем показ слайдов
      if(results.value == 16769055){ //16769055 - код кнопки на пульте, на который хотим назначить завершение показа слайдов
        Serial.println('0');
      }      
      //запускаем показ слайдов
      if(results.value == 16754775){
        Serial.println('1');
      }
      //следующий слайд
      if(results.value == 16712445){
        Serial.println('2');
      }
      //предыдущий слайд
      if(results.value == 16720605){
        Serial.println('3');
      }
      
    }
    old_result = new_result;
    irrecv.resume();
  }
}


Приложение на компе

Приложение на компе написал на C#. Т.к. я плохой программист программист-любитель, программка простенькая, консольная, демон не знаю как писать, да и чтоб постоянно прослушивать COM порт, решение лучше, чем while(true) не нашел.
Программка читает COM порт. При получении 0 — завершает показ, 1 — запускает показ слайдов, 2 — следующий слайд, 3 — предыдущий слайд.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Microsoft.Office.Interop.PowerPoint.Application oPPT = new 

Microsoft.Office.Interop.PowerPoint.Application();
            oPPT.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
            Microsoft.Office.Interop.PowerPoint.Presentation present = 

oPPT.ActivePresentation;

            SerialPort port = new SerialPort("COM29", 9600);
            port.Open();
            int data;
            while(true)
            {
                data = Convert.ToInt32(port.ReadLine());
                //запускаем показ слайдов
                if(data == 1)
                {
                    present.SlideShowSettings.Run();
                }

                //завершаем показ слайдов
                else if(data == 0)
                {
                    present.SlideShowWindow.View.Exit();
                }

                //следующий слайд
                else if(data == 2)
                {
                    present.SlideShowWindow.View.Next();
                }

                //предыдущий слайд
                else if (data == 3)
                {
                    present.SlideShowWindow.View.Previous();
                }

            }
        }
    }
}

P.S. Еще для полного счастья в каждом if не хватает проверок. Например: при завершении показа слайдов, нужна проверка «запущен ли показ слайдов». Нужно покопаться в методах объекта oPPT или present.
По материалам Хабрахабр.



загрузка...

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

Наверх