Мечта детства на колесах ЧАСТЬ 1

В те недалекие времена, когда компьютеры умели только складывать и умножать и были вот таких размеров:


P.S. если кто найдет на него документацию, просьба поделиться )

купил мне папа обычную машинку на пульте управления. Она была крайне не интересной, потому что только каталась. Ну поигрался я ей с недели две и она мне надоела. Именно в тот момент я захотел нормальную машинку с пищалками, мигалками и " пукалками " Спустя 15 лет я вспомнил про мою тамошнюю мечту и решил сделать себе такую. но идей не было, т.к. я не представлял даже как они устроены.

Спустя несколько месяцев я познакомился с ARDUINO, мечта моего детства. И тут понеслооось. Сделал я свою первую машинку за неделю. Обычная робоплатформа которую можно купить ЗДЕСЬ Именно такая у меня и была. В добавок к ней имелся комплект радио модулей 433МГц ну и все это было на Arduino и каталось. Тоже скучно.

И решил я тогда сделать нормальную машину с фарами и сигналами. Под руку как раз попался пульт от музыкального центра. Такой простой, который можно купить за 5$ в Китае.
Сначала было решено сделать управление, а потом разбираться с платформами и всем остальным.

Немного погуглив было понятно, что при считывании в пульте нужно считать миллисекунды, мне считать не хотелось, во мне проснулись зачатки инженера. Я стал еще гуглить, и нашел замечательную статью P.S. «Да поможет тебе Robocraft». В статье есть хорошая библиотека и весь материал. С библиотекой у меня не сложилось, потому что возвращается разное значение, а вот код пошел хорошо)

Собрав несложную схему:


а так это все выглядит на макетке:

и загрузив не хитрый код в ARDUINO получаем полноценное управление.

/* Данный скетч предназначен для управления Ардуиной практически любим пультом ИК,
 вне зависимости от протоколов, и прочих заморочек.
 Принцип его работы заключается в том, что он сравнивает сигналы разных команд с одного ДУ.
 Для работы программы надо сначала прижать 10й пин к 1, и нажать каку-ть кнопку на ДУ, чтобы подружить
 нашу ардуину с ДУ. Далее 10-й пин кладем на 0, и при нажатии различных кнопок на пульте получаем разные коды на выходе.
 Буду рад, если мой скечт кому-нибудь пригодится =)
 Peter.
 */

#include <EEPROM.h>


int DIR_1 = 8;   //задаем пины для моторов
int PWM_1 = 11; 
int DIR_2 = 7;   
int PWM_2 = 3; 

enum { 
  Intervals = 70 }; //Здесь мы указываем, сколько битов бы будем слушать. 
//Разные ДУ выдают разное количество битов.


int starttime, endtime, time,n,  code, sp=200;
char arrayfix[Intervals],array[Intervals]; // Массивы времени импульсов
byte  distinction;
void setup() {  

  pinMode(DIR_1, OUTPUT); // задаем как выходы
  pinMode(PWM_1, OUTPUT);
  pinMode(9, INPUT); // К ноге приемника
  pinMode(5, INPUT); // К кнопки для запоминания опорного кода
  pinMode(13, INPUT);
   
   
   
   
  pinMode(DIR_1, OUTPUT); // задаем как выходы для моторов
  pinMode(PWM_1, OUTPUT);
  pinMode(DIR_2, OUTPUT); 
  pinMode(PWM_2, OUTPUT);
  
  Serial.begin(9600); 
  Serial.println ( "start...");

  for (byte x=0; x<Intervals; x++) //Читаем из EEPROM опорный масив (если он записан =)
  {
    arrayfix[x]=EEPROM.read(x); 
  }
}

void loop()
{

  digitalWrite(13, LOW);
  
  if (digitalRead(9)==0) //Если сигнал есть..
  {
    starttime=micros();  
    while (digitalRead(9)==0); //..ждем пока он не прекратися.
    endtime=micros();
    time=endtime-starttime; // Высчитываем время.
    if (time>1000) //если это не шум, а скорее стартовый бит, начинаем слушать.
    {
      while (n<Intervals) //В цикле слушаем бит за битом.
      {

        if (digitalRead(9)==0) //Если сигнал есть (1)..
        {

          starttime=micros();
          while (digitalRead(9)==0);
          endtime=micros();
          time=endtime-starttime; // ...высчитываем его время.

          if (digitalRead(10)==1) //Если кнопка нажата..

            arrayfix[n]=time/100;  //..записываем в массив "опорный код" 
          //в виде промежутков времени наличия сигнала.
          array[n]=time/100;     // Также записываем в массив текущий код.
          n++;
        }
        if (digitalRead(9)==1) //Если сигнала нет (0)..
        { 

          starttime=micros();

          while (digitalRead(9)==1) //пока ждем появления сигнала проверим, не остановка ли это передачи...
          {
            endtime=micros();
            time=endtime-starttime;

            if (time>10000)  //  ...ага, отсановка. Тогда заполняем 
              //остаток масива 0-ми, и выходим из цикла.
            {
              while (n<Intervals)
              {
                if (digitalRead(10)==1) 
                  arrayfix[n]=0;
                array[n]=0 ;
                n++;
              }
              goto out; 
            }
          }   
          endtime=micros();
          time=endtime-starttime;
          if (digitalRead(10)==1)
            //EEPROM.write(n, time); 
            arrayfix[n]=-time/100; //для отсутствия сигнала запишим время с (-). 
          //Делим на 100 для того, чтобы можно было запихнуть данные в 1 байт, а не использовать растачительно int.
          array[n]=-time/100;    
          n++;
        }

      }
out: // Если остановка, то выходим сюда.

      if (digitalRead(10)==1)//Если кнопка нажата, записываем все в EEPROM
      { 
        Serial.println ( "button is pressed");
        for (byte x=0; x<Intervals; x++)
        {
          EEPROM.write(x, arrayfix[x]); 

        }
      }  






      n=0;

      for (byte x=0; x<Intervals; x++) //В этом цикле мы ищем отличия в преданном коде и опорном.
      {        

        if (abs(array[x]-arrayfix[x])>5 && array[x]!=0 && arrayfix[x]!=0) // Здесь мы отслеживаем,
          // где есть отличия на логическом уровне.
          //Если отличие больше 500 мкс, то это однозначно разные логичесике уровни.
        {
          distinction++;
          code=code+(x+1)*distinction; //генерируем код
        }
      }

      Serial.println("========Result==========");  // Выводим, что имеем на выходе

      Serial.print("Otlichiya   ");
      Serial.println(distinction);
      Serial.print("Code   ");
      Serial.println(code);


      management(code);


      distinction=0;
      code=0;

    }
  }   

}







void management ( int code){
  Serial.println(" manadment");

  switch(code)
  {
  case 161:
    forward(sp);
    break;

  case 1099:
    back(sp);
    break;
    
   case 526:
    right(sp);
    break;
    
   case 1085:
    left(sp);
    break;
    
   case 1025: // уменьшение скорости
   if (sp != 50) { sp -= 5;}
   else {digitalWrite(13, HIGH);}
    Serial.println(sp);
    break; 
    
   case 1089: // увеличение скорости
   if (sp != 255) { sp += 5;}
   else {digitalWrite(13, HIGH);}
    Serial.println(sp);
    break; 
  }
}




void forward (int a)
{ 
  Serial.println(" forward");
  digitalWrite(DIR_1, HIGH);
  analogWrite(PWM_1, a);
  digitalWrite(DIR_2, HIGH);
  analogWrite(PWM_2, a);

  delay(50);
}



void back (int a)
{ 
  Serial.println(" back");
  digitalWrite(DIR_1, LOW);
  analogWrite(PWM_1, a);
  digitalWrite(DIR_2, LOW);
  analogWrite(PWM_2, a);
  
  delay(50);
}


void left (int a)
{ 
  Serial.println(" left ");
  digitalWrite(DIR_1, HIGH);
  analogWrite(PWM_1, a);
  digitalWrite(DIR_2, LOW);
  analogWrite(PWM_2, a);
  
  delay(50);
} 


void right (int a)
{ 
  Serial.println(" right ");
  digitalWrite(DIR_1, LOW);
  analogWrite(PWM_1, a);
  digitalWrite(DIR_2, HIGH);
  analogWrite(PWM_2, a);
  
  delay(50);
} 



Чем мне нравится этот код, так это его простотой. с легкостью можно добавлять всякие действия, будь то пищалка, моргалка или " перделка ". Просто находите код кнопки, добавляете функцию и вуаля, ваша машинка стала моргать или подмигивать мимо проходящим девушкам.

и так, с управление разобрались и это уже хорошо. Дело осталось за малым, собрать корпус и сделать электронику, собрать все это чудо и воплотить мечту детства.

корпус буду делать завтра, а статья появится в понедельник. Да прибудет с тобой сила.

Часть 2: делаем корпус.

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.