Самоход на ик пульте

Тема в разделе "Глядите, что я сделал", создана пользователем Un_ka, 26 янв 2019.

?

Какое управление и связь с чем-либо вам по душе?

  1. радио nrf rf

    50,0%
  2. ик

    50,0%
  3. WI-FI

    33,3%
  4. bluetooth

    33,3%
  5. Может что-нибудь ещё?

    8,3%
Можно выбрать сразу несколько вариантов.
  1. Un_ka

    Un_ka Гик

    CIMG8956-min.JPG ДУ пульт и ИК-приёмник есть в большинстве стартовых наборах ардуино.
    Также эти компоненты очень легко найти. А настраивать и мучиться с конденсаторами не надо.
    В отличие от радиомодулей на практике от помех по питанию скорее рестартниться ардуино , чем прийдут неверные данные.
    Вообщем сделал вот такую машинку : CIMG8956-min.JPG CIMG8957-min.JPG CIMG8958-min.JPG CIMG8941-min.JPG CIMG8947-min.JPG
    На фотографиях можно увидеть что контроллера два . Второй - Wavgat Nano , на нём я отрабатываю передачу данных ик способом уже с одной ардуино на другую.
    На последнем фото советский конденсатор ЭТО 72 года на 30 мкФ. Ёмкость хоть какая-то есть ,но напряжение с него быстро падает даже на мегаомном вольтметре. Ультразвуковой датчик стоит , но но подключать пока руки не дошли. Также изначально китайский лазер крутился на шаговом моторе , но его усилия не хватало , поэтому поставил сервомашинку а драйвкр остался. Сам лазер поставил для большей наглядности работы сервоприводов.
    Код таков:
    Код (C++):
    #include <RCSwitch.h>
    RCSwitch mySwitch = RCSwitch();

    #include "IRremote.h"
    IRrecv irrecv(8);
    decode_results results;
    #include <Stepper_28BYJ.h>
    #define STEPS 4078
    Stepper_28BYJ stepper(STEPS, 3, 4, 5, 6);
    #include <Servo.h>
    Servo servoV;//вертикаль
    Servo servoRul;
    bool laser = 0;
    int i ;
    byte led = 1;
    unsigned long time_trand = 0, st = 0;
    int ss = 90 , gs = 90, trend = 0;
    #define in1  3
    #define in2  4
    #define in3  5
    #define in4  6
    #define dl  5 // пусть крутится быстро!!!
    #define srok 4000
    #define ch_minus 0xFFA25D
    #define ch 0xFF629D
    #define ch_plus 0xFFE21D
    #define vol_minus 0xFFE01F
    #define vol_plus 0xFFA857
    #define prev 0xFF22DD
    #define next 0xFF02FD
    #define play_pause 0xFFC23D
    #define eq 0xFF906F
    const unsigned long key[] =
    { 0xFF6897, //0
      0xFF30CF,  //1
      0xFF18E7,  //2
      0xFF7A85,  //3
      0xFF10EF,  //4
      0xFF38C7,  //5
      0xFF5AA5,  //6
      0xFF42BD,  //7
      0xFF4AB5,  //8
      0xFF52AD,  //9
      0xFF9867,  //100+
      0xFFB04F   //200+
    };

    void setup() {
      Serial.begin(9600);
      Serial.print("startyem");
      stepper.setSpeed(300);
      pinMode(in1, OUTPUT);
      pinMode(in2, OUTPUT);
      pinMode(in3, OUTPUT);
      pinMode(in4, OUTPUT);
      pinMode(A0, OUTPUT);
      pinMode(A1, OUTPUT);
      pinMode(A2, OUTPUT);
      pinMode(A3, OUTPUT);
      pinMode(7, OUTPUT);
      servoV.attach(9);
      servoRul.attach(10);
      mySwitch.enableTransmit(11);
      pinMode(13, OUTPUT);
      irrecv.enableIRIn();
      attachInterrupt(0, wall, FALLING);
     

    }


    void loop() {
      if ( irrecv.decode( &results )) {
        Serial.println(results.value, HEX);
        if (results.value == key[5]) {
          digitalWrite( A0, 0 );
          digitalWrite( A1, 0 );
          digitalWrite( A2, 0 );
          digitalWrite( A3, 0 );
        } else if (results.value == key[2]) {
          go();
        } else if (results.value == key[8]) {
          back();
        } else if (results.value == key[4]) {
          left();
        } else if (results.value == key[6]) {
          rihgt();
        } else if (results.value == vol_minus) {
          trend = 1 ;
          if (millis() > (time_trand + srok) && trend == 1 || trend != 1) {
            time_trand = millis();
          }
          gs = gs - 1;
          gs = constrain(gs, 0, 180);
          servoRul.write(gs);

        } else if (results.value == vol_plus) {
          trend = 2 ;
          if (millis() > (time_trand + srok) && trend == 2 || trend != 2) {
            time_trand = millis();
          }
          gs = gs + 1;
          gs = constrain(gs, 0, 180);
          servoRul.write(gs);
        } else if (results.value == prev) {
          trend = 1 ;
          if (millis() > (time_trand + srok) && trend == 1 || trend != 1) {
            time_trand = millis();
          } //stepp(50);

          stepper.step(50);
        } else if (results.value == next) {
          trend = 2 ;
          if (millis() > (time_trand + srok) && trend == 2 || trend != 2) {
            time_trand = millis();
          } //stepp(-50);
          stepper.step(-50);
        } else if (results.value == ch_plus) {
          trend = 3 ;
          if (millis() > (time_trand + srok) && trend == 3 || trend != 3) {
            time_trand = millis();
          }
          ss = ss + 1;
          ss = constrain(ss, 0, 180);
          servoV.write(ss);
        } else if (results.value == play_pause) {
          trend = 4 ;
          if (millis() > (time_trand + srok) && trend == 4 || trend != 4) {
            time_trand = millis();
          }
          ss = ss - 1;
          ss = constrain(ss, 0, 180);
          servoV.write(ss);
        } else if (results.value == key[11]) {
          trend = 5 ;
          if (millis() > (time_trand + srok) && trend == 5 || trend != 5) {
            time_trand = millis();
          }
          ss = ss + 1;
          ss = constrain(ss, 0, 180);
          servo(9, ss);
        } else if (results.value == key[10]) {
          trend = 6 ;
          if (millis() > (time_trand + srok) && trend == 6 || trend != 6) {
            time_trand = millis();
          }
          ss = ss - 1;
          ss = constrain(ss, 0, 180);
          servo(9, ss);
        } else if (results.value == 0xFFFFFFFF && millis() < (time_trand + srok)) {
          switch (trend) {
            case 0:
              break;
            case 1:
              //stepp(50);
              gs = gs - 3;
              gs = constrain(gs, 0, 180);
              servoRul.write(gs);
              break;
            case 2:
              //stepp(-50);
              gs = gs + 3;
              gs = constrain(gs, 1, 180);
              servoRul.write(gs);
              break;
            case 3:
              ss = ss + 3;
              ss = constrain(ss, 1, 180);
              servoV.write(ss);  break;
            case 4:
              ss = ss - 3;
              ss = constrain(ss, 0, 180);
              servoV.write(ss);  break;
            case 5:
              ss = ss + 3;
              ss = constrain(ss, 0, 180);
              servo(9, ss); break;
            case 6:
              ss = ss - 3;
              ss = constrain(ss, 0, 180);
              servo(9, ss); break;

          }
        } else if (results.value == eq) {
          switch (led) {
            case 1:
              digitalWrite( 7, 1 );
              led = 2;
              break;
            case 2:
              digitalWrite( 7, 0 );
              led = 1;
              break;
          }
        } else if (results.value == ch) {
          /*switch (laser) {
              case 0:

                digitalWrite( 13, 1 );
                laser = 1;
                mySwitch.send(5393, 24);
                delay(1000);
                break;
              case 1:
                digitalWrite( 13, 0 );
                laser = 0;
                break;
            }*/

          mySwitch.send(B0100, 4);
          delay(1000);
          mySwitch.send(B1000, 4);
          delay(1000);
        }
        irrecv.resume();
      }
    }
    int stepp(int shag) {
      if (shag > 0) {
        i = shag;
        while ( i != 0) {
          digitalWrite( in1, HIGH );
          digitalWrite( in2, HIGH );
          digitalWrite( in3, LOW );
          digitalWrite( in4, LOW );
          delay(dl);

          digitalWrite( in1, LOW );
          digitalWrite( in2, HIGH );
          digitalWrite( in3, HIGH );
          digitalWrite( in4, LOW );
          delay(dl);

          digitalWrite( in1, LOW );
          digitalWrite( in2, LOW );
          digitalWrite( in3, HIGH );
          digitalWrite( in4, HIGH );
          delay(dl);

          digitalWrite( in1, HIGH );
          digitalWrite( in2, LOW );
          digitalWrite( in3, LOW );
          digitalWrite( in4, HIGH );
          delay(dl);
          i--;
        }
      } else {
        i = shag;
        while ( i != 0) {
          digitalWrite( in1, HIGH );
          digitalWrite( in2, LOW );
          digitalWrite( in3, LOW );
          digitalWrite( in4, HIGH );
          delay(dl);
          digitalWrite( in1, LOW );
          digitalWrite( in2, LOW );
          digitalWrite( in3, HIGH );
          digitalWrite( in4, HIGH );
          delay(dl);
          digitalWrite( in1, LOW );
          digitalWrite( in2, HIGH );
          digitalWrite( in3, HIGH );
          digitalWrite( in4, LOW );
          delay(dl);
          digitalWrite( in1, HIGH );
          digitalWrite( in2, HIGH );
          digitalWrite( in3, LOW );
          digitalWrite( in4, LOW );
          delay(dl);
          i++;
        }
      }
    }
    int servo(byte port, byte pos) {
      for (int i = 1; i <= 180; i++) {
        digitalWrite(port, HIGH);
        delayMicroseconds(pos);
        digitalWrite(port, LOW);
        delayMicroseconds(20000 - pos);
        delay(1);
      }
      //digitalWrite(servo, LOW);
    }

    void wall() {
      if (st < millis() - 1000) {
        //back();
        //delay(5);
        digitalWrite( A0, 0 );
        digitalWrite( A1, 0 );
        digitalWrite( A2, 0 );
        digitalWrite( A3, 0 );
        st = millis();
      }
    }
    void go() {
      digitalWrite( A0, 0 );
      digitalWrite( A1, 1 );
      digitalWrite( A2, 0 );
      digitalWrite( A3, 1 );
    }

    void back() {
      digitalWrite( A0, 1 );
      digitalWrite( A1, 0 );
      digitalWrite( A2, 1 );
      digitalWrite( A3, 0 );
    }

    void left() {
      digitalWrite( A0, 1 );
      digitalWrite( A1, 0 );
      digitalWrite( A2, 0 );
      digitalWrite( A3, 1 );
    }

    void rihgt() {
      digitalWrite( A0, 0 );
      digitalWrite( A1, 1 );
      digitalWrite( A2, 1 );
      digitalWrite( A3, 0 );
    }
    Продолжение следует ...
     
    HEtort и BAR__MEN нравится это.
  2. Un_ka

    Un_ka Гик

    Кстати скетчи связи адрдуино по ик я разместил в этой теме.
     
  3. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Почему заголовок темы не соответствует содержимому?
     
  4. Hods

    Hods Нуб

    Веселая вещица, а с темой что? ИК пульт смутил наверное ;)
     
  5. Un_ka

    Un_ka Гик

    Код (C++):


    byte moon;

     
     
    BAR__MEN нравится это.
  6. Un_ka

    Un_ka Гик

    это я команды форума проверял
    Код (C++):
     [code/.] (как они называются)
     
  7. Un_ka

    Un_ka Гик

  8. Un_ka

    Un_ka Гик

    Пока делал пульт сжёг три китайских потанциометра , но смог найти ошибку в коде . Вместо реле в разрыв после светодиодов поставил pnp трнзистор. Теперь перключаю фары быстро и без щёлкания. Чуть не спалил атмегу (один из пинов оказался замкнут на плюс).
    Иногда начинают шалить сервоприводы , дёргаться и так далее . И один мотор редуктор проворачивается со стрнным звуком , разбирал ничего странного не обнаружил.
     
  9. Un_ka

    Un_ka Гик

    Скачал на телефон приложение , позволяющие передавать видео онлайн .

    Приделал его на изоленту к самоходу.
    Картинка хоть и плохого качества , но и так сойдёт.
    Из поломок : сначала сломался вал-переходник ( он у меня из пластика ) , потом в результате усталости металла сломалась проволочка ( вроде из меди 1мм) крпления вала к колесу.
     
  10. Un_ka

    Un_ka Гик

    Нынче новую версию самохода делаю.
     
  11. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Такое ощущение, что это личный блог ТС....
     
  12. Un_ka

    Un_ka Гик

    На форуме rcdesign для этого блоги и есть.
     
  13. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Ну вот, моя идея уже не моя :(