Arduino: для детей, взрослых и аудиоаппаратуры :)
#9

Итак, продолжим. Буду писать пример кода, зачем он нужен и что он делает. постепенно в него буду добавлять фичь.

Варнинг, часть, если не все, будет нагло скопипащено отовсюду )))


Пример номер ноль.

http://arduino.cc/en/Tutorial/BareMinimum
PHP код:
void setup() {
  
// put your setup code here, to run once:
}

void loop() {
  
// put your main code here, to run repeatedly: 

Отличительной чертой данного кода является его нейтральность. Оно ничего не делает, но вокруг него мы будем жить.

Что же тут написано? Это две функции, которые вызываются ардуиной. Первая (setup) вызывается в момент включения ардуины, только один раз. В нее следует ложить код инициализации вякого разного - выставлять тип ножек (вход/выход), запускать инициализацию всяких библиотечек, просчитывать что-то один раз...

Вторая (loop) - запускается в цикле, т.е. процессор постоянно в ней крутится. Тут мы будем складывать рутинную работу. А-ля считывание кнопки, если изменилась = делаем что-то. Закончили делать - цикл повторяется заново.

Синтаксис -
void loop() { }
void - тип данных, возвращаемых функцией. войд - нифиха или что-то подобное.
луп - имя функции
в скобочках круглых - можно положить параметры, что функция ожидает получить. в данном случае их нет.
между фигурными скобочками складываем наш код.

все, что находится в строчке после "//" - комменты кода, ниначто не влияют. Туда для себя можно ставить заметки. Аналогично работает комбинация из /* */
/*
много
строчный
коммент */
А, из полезностей комментов - ими можно закомментить кусок кода, который мы пока не хотим компилировать. Отключит строчку, либо целый кусок.






В чате пробегала задача работы с пультиком ) Ее мы и сделаем.
Ардуино уже поставляется с библиотечкой ИК интерфейсинга. И с кучей примеров ее применения. Возьмем самый простой, берем в меню - File>Examples>Arduino-Remote-IR-Master>IRrecvDemo

получаем следующий код:


PHP код:
#include <IRremote.h>    // <<<< Подключает файл библиотечки

int RECV_PIN 11;    // <<<< декларируем переменную типа int (integer - для циферок), и заталкиваем в нее десятичное значение 11, соответствующее номеру ноги на плате ардуинки. К ней мы подключим выход ИК приемника.

IRrecv irrecv(RECV_PIN); // декларируем обьект, который для нас будет работать с ИК приемником, типа "IRrecv", именем irrecv, и передаем ему RECV_PIN (т.е. циферку 11, т.е. ногу ардуинки с ик приемником).

decode_results results// видимо сюда будут складываться результаты принятых по ИК кодов...

void setup() // функция инициализации
{
  
Serial.begin(9600); // инициализация фичи сериал-порта. ардуинка может общаться с компьютером через сериал порт, который эмулируется средством USB... вобщем можно посылать и принимать данные с ардуинки, а также смотреть на них в проге ардуинки, нажав на пимпочку в правом верхнем углу, serial monitor.
  
  
  
irrecv.enableIRIn(); // Start the receiver // запуск библиотечки приема ИК. нужно - значит нужно ))
}

void loop() { // основной цикл
  
if (irrecv.decode(&results)) { //если функция irrecv.decode вернула положительный результат, то она положила этот результат и в results. На счет "&" не паримся, эт немножко сложней и извращенней - символизирует передачу не переменной а ее адреса, и тогда функция может в этот адрес что-то положить... неважно, главное чтоб работало.
    
Serial.println(results.valueHEX);// Serial.println печатает строку results.value в последовательный порт. Т.е. мы будем видить то, что попадает на ИК приемник. вернее уже ракодированные значения кнопок. "HEX" - не знаю, видимо форматирование результата, чтоб не печаталось в бинарном виде, а в виде 0х23BF шестнадцетиричного формата.
    
irrecv.resume(); // Receive the next value // видимо нужно для жизнедеятельности ИК-библиотечки )
  

  
delay(100); // задержка, чтоб проц не слишком активно бегал по циклу безконечному. В этот период времени проц ждет заветные 100 чего-то там, и затем продолжает свою безконечную работу.


Итог - мы, после заливки в МК данного кода, получим в Serial Monitor-е коды кнопок пульта.
Со стороны железа - потребуется какой-то (понятья не имею какой) ик-приемник (они на разные частоты делаются, возможно с разным пинаутом... но мне два раза везло с ними, по типичной схемке "как на картинке"). Картинка - тут,
http://www.righto.com/2009/08/multi-prot...brary.html
http://arcfn.com/images/ir-schematic.png
Vcc и GND берутся с гребенки на платке ардуинки, там-же находится первый попавшийся свободный вход. Желательно не трогать первые два входа/выхода, т.к. туда прикручены какие-то плюшки на плате.

Вуаля, в компьютер поступают ИК коды.
Програмка полезна, т.к. позволяет нам собрать список кодов, и их затем использовать при приеме и назначении "действий" в МК.





Пример 2.
Включение/выключение светодиода (усилителя, лампочки, вентилятора...) средством пульта.

http://arduino.cc/en/Tutorial/Blink



PHP код:
#include <IRremote.h>

int RECV_PIN 11;

IRrecv irrecv(RECV_PIN);

decode_results results;
bool isPoweredOn false// переменная, в которой будем хранить статус включенности светодиода.
void setup()
{
  
pinMode(13OUTPUT); // пин номер 13 будет у нас выходом. туда светодиод и подключим.
  
Serial.begin(9600);
  
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (
irrecv.decode(&results)) {
    if(
results.value == 0x77E1E06F) { // если код кнопки равен 0x77E1E06F (этот код взят по результатам работы примера 1)
            
if (isPoweredOn) {//если isPoweredOn=true, т.е уже включен - 
                
isPoweredOn false;   // то выключаем в переменной
                
digitalWrite(13LOW); // выключаем физически, присваевая лог.уровень LOW на ножку 13
            
}
            else { 
// иначе
                
isPoweredOn true;    // включаем в переменной
                
digitalWrite(13HIGH);    // включаем физически
            
}
        }
    
Serial.println(results.valueHEX);
    
irrecv.resume(); // Receive the next value
  
}
  
delay(100);






Ту би континьюед :)

Аминь.
Ответ


Сообщения в этой теме

Возможно похожие темы ...
Тема / Автор Ответы Просмотры Последний пост

Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)