Главная » Микроконтроллеры
Призовой фонд
на январь 2017 г.
1. 5000 руб.
Академия Благородных Металлов
2. 1000 руб.
Radio-Sale
3. Регулируемый паяльник 60 Вт
Паяльник
4. 600 руб.
От пользователей
5. Тестер компонентов LCR-T4
Паяльник

ИК пульт на MSP430 Lanchpad

Проект создания сенсорного частично универсального пульта под определенные задачи. Пульт создается на базе контроллера MSP430 Lanchpad, купленного еще по 4.30$ (на данный момент цена 9.99$) и сенсорного блока 430BOOST-SENSE1 (цена 10$).

430BOOST-SENSE1 (Capacitive Touch BoosterPack) - дополнительная плата к набору разработчика MSP430 Value Line LaunchPad development kit (MSP-EXP430G2). На плате расположены некоторые варианты емкостных сенсорных датчиков, включая колесо прокрутки, кнопку и датчик приближения. Кроме того, на плате установлены 9 светодиодов, которые обеспечивают индикацию взаимодействия пользователя с емкостными сенсорными датчиками. 

Дополнительно к 430BOOST-SENSE1 прилагается предварительно запрограммированный микроконтроллер MSP430G2452IN20 семейства MSP430 ValueLine для демонстрации работы с емкостными сенсорными датчиками. Таким образом, разработчик имеет возможность ознакомиться с работой сенсорных датчиков без необходимости программирования микросхемы.

При объединении с платой LaunchPad kit, плата 430BOOST-SENSE1 предлагает законченный аппаратный и программный образец разработки, позволяющий  быстро и легко заменить любые физические кнопки элементами на основе емкостных сенсорных датчиков. 

Изучение даташита помогло найти используемые выводы MSP430 Lanchpad (см. рис.)

 

С выводов P1.3 - P1.7 будем управлять светодиодами, а выходов P2.0 - P2.5 получать показания с панели.

Для программирования использовалась Arduino-подобная среда программирования EnergiaИспользовал библиотеку CapTouch. После экспериментов с получением значений при нажатиях на панель, назначение нажатий определим следующее.

Одновременное нажатие P2.0 (на рисунке красное) и P2.5 (D0) последовательный перебор текущего устройства по возрастанию,нажатие P2.5(D0) перебор текущего устройства по убыванию,при этом на светодиодах соответствующая индикация 

Нажатие на области P2.1 - P 2.4 и между двумя соседними областями - отправка кода с блинком светодиода D0. Нажатие двумя пальцами P2.0 - переход в режим sleep

Индикация для выводов

P1_0,P1_3,P1_4,P1_5,P1_6,P1_7

приведена в массиве

const boolean LEDS_MODE[11][6]={
   {0,0,0,0,0,0}, // спящий режим
   {0,0,1,0,0,0}, // выбор пульта 1
   {0,0,1,1,0,0}, // выбор пульта 2
   {0,0,1,1,1,0}, // выбор пульта 3
   {0,0,1,1,1,1}, // выбор пульта 4
   {0,1,0,1,1,1}, // выбор пульта 5
   {0,1,0,0,1,1}, // выбор пульта 6
   {0,1,0,0,0,1}, // выбор пульта 7
   {0,1,0,0,0,0} // выбор пульта 8
   };

В принципе можно создать 16 пультов по 8 клавиш (а задействуя P_0 в 2 раза больше), но делал для себя для наглядности мне так более удобно. 

У меня группа 1 - светодиодные ленты RGB - у меня 2 шт. Вторая группа - новогодняя лампа-ночник  Остального пока нет - но есть задумки кое-какие.

Для отправки кодов через ИК-светодиодов собирался использовать библиотеку IRRemote. Казалось все просто и работы максимум на рабочую неделю, но оказалось все не так. 

Часть проекта с выбором режимов, индикацией и выбором кодов для отправки была написана быстро. Вот код

#include "CapTouch.h"

const int PINS[]={0,P2_0,P2_1,P2_2,P2_3,P2_4,P2_5};
const int LEDS[]={0,P1_0,P1_3,P1_4,P1_5,P1_6,P1_7};
const boolean LEDS_MODE[11][6]={
                       {0,0,0,0,0,0}, // спящий режим
                       {0,0,1,0,0,0}, // выбор пульта 1
                       {0,0,1,1,0,0}, // выбор пульта 2
                       {0,0,1,1,1,0}, // выбор пульта 3
                       {0,0,1,1,1,1}, // выбор пульта 4
                       {0,1,0,1,1,1}, // выбор пульта 5
                       {0,1,0,0,1,1}, // выбор пульта 6
                       {0,1,0,0,0,1}, // выбор пульта 7
                       {0,1,0,0,0,0} // выбор пульта 8
                       };
const int choice_command[]={0,1,1,1,1,0,1,0,1,1,0,0,1,0,0,0};                      
int mode=0;
int sleep=0;
int base_counts[7];
unsigned int count, base_count,delta_count;
int state = 0;

static const unsigned int threshold = 150;
static const unsigned int threshold2 = 250;
CapTouch touch1;


void setup() {
  Serial.begin(9600);
  for(int i=1;i<7;i++)
   {touch1.add(PINS[i]);
   base_counts[i]=touch1.measure(PINS[i]);
    pinMode(LEDS[i], OUTPUT);
   }
}

void loop()
{
 change_mode(get_pressed());
 establish_leds(mode);
 delay(500);
}

// проверка touch-клавиш на нажатие
int get_pressed()
  {
  int pos=0;
  for(int i=0;i<7;i++)
    {
    count = touch1.measure(PINS[i]);
    if(base_counts[i] < count) 
      {base_counts[i] = (base_counts[i] + count) >> 1;
      delta_count = 0;}
    else 
      {delta_count = base_counts[i] - count;}
    if(delta_count > threshold) 
      {
       uint16_t bitmask = 1;
       if (i >0)
        {for (int j = 0; j < i-1; ++j) 
	    bitmask <<= 1;
        }
       pos=pos+bitmask;
       if(delta_count>280 && i==1)
         sleep=1;
      }

    else 
      {base_count = base_count - 1;}
    delay(10);
   }   
 return pos;
 }
 // установить светодиоды для режима
 void establish_leds(int mode)
   {
   for(int i=1;i<7;i++) 
    digitalWrite(LEDS[i],LEDS_MODE[mode][i-1]);  
   }
 // изменить режим после нажатия
 void change_mode(int pos)
   {
   // анализ нажатий
   // переход в спящий режим
   if(sleep==1) 
     {mode=0;sleep=0;
     return;}
   // выбор следующего режима
   if(bitRead(pos,0) && bitRead(pos,5))
     {mode=mode+1;mode=min(8,mode);
      return;} 
   // выбор предыдущего режима
   if(bitRead(pos,5))
     {mode=mode-1;mode=max(1,mode);
      return;} 
   // отправка кода  
   byte bpos;
   bpos=lowByte(pos); 
   bitClear(bitClear(bpos,0),5);
   bpos=bpos>>1; 
   if(mode>0 && choice_command[bpos])
     {send_command(mode,bpos);
     return;}
   } 
// изменить режим после нажатия
 void send_command(int high,byte low)
   { 
   byte bsend; 
   bsend=lowByte(high)<<4; 
   bsend+=low;
   Serial.println(bsend,HEX);
   digitalWrite(P1_0,HIGH);
   delay(500); 
   digitalWrite(P1_0,LOW);
   } 

Дальше начались проблемы. При подключении библиотеки IRremote, скетч терял нажатия на две области, а при попытке отправить код через ИК-светодиод скетч вообще не работал. Для отправки кодов использовал второй комплект M430. Два модуля связаны по последовательному порту. Прием байта из последовательного порта, выбор кода из таблицы и отправка через ик светодиод (используется библиотека IRremote).

Вот скетч

#include "IRremote.h"

IRsend irsend;
int inChar;
boolean stringComplete = false;
// список кодов
long irkod[128]={
  0x12,0x24,0x36,0x48,0,0x6c,0,0xff,0x5a,0,0,1,0,0,0,0,0, // ночник
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
};
void setup()
{
  Serial.begin(9600);
}

void loop() {

  if (stringComplete) {
    //irsend.sendRC5(irkod[inChar], 12); 
    irsend.sendRC5(inChar, 12); 
    stringComplete = false;
  }

}

void serialEvent() {
  while (Serial.available())
   {
    // get the new byte:
    inChar = (int)Serial.read(); 
    stringComplete = true;
   }
}
Прикрепленные файлы:

Теги:

Опубликована: 10.11.2013 0 0
Я собрал 0 Участие в конкурсе 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
MEANDREY1 #
Практическое применение какое?
Ответить
0
wapster #
Я так обрадовался, думал на Си написано, а тут энергия.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Мультиметр DT9205A UNI-T UT-61A
вверх