LEGO и Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем darkavenger, 8 авг 2013.

  1. darkavenger

    darkavenger Гик



    Код (C++):

    int speed = 255;
    int trigPin = 4;
    int echoPin = 2;
    int motAF = 5;
    int motBF = 6;
    int motAB = 9;
    int motBB = 10;
    int analogPin = 1;

    long distance;
    long randNumber;

    void setup() {
    pinMode(motAF, OUTPUT);
    pinMode(motBF, OUTPUT);
    pinMode(motAB, OUTPUT);
    pinMode(motBB, OUTPUT);
     
    pinMode(trigPin,OUTPUT);
    pinMode(echoPin,INPUT);

    randomSeed(analogRead(0));
    }

    void loop() {

    speed = analogRead(analogPin) / 4;
     
    distance = getDistance();
    if (distance > 80)
       {
       analogWrite(motAF, speed);
       analogWrite(motBF, speed);
       }
    else
        {
       analogWrite(motAF, 0);
       analogWrite(motBF, 0);
       delay(500);
       randNumber = random(-120,120);
       analogWrite(motAB, speed/2+randNumber);
       analogWrite(motBB, speed/2-randNumber);
       delay(1000);
       analogWrite(motAB, 0);
       analogWrite(motBB, 0);
       delay(500);
         
       }
    delay(100);
    }

    long getEchoTiming() {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      long duration = pulseIn(echoPin,HIGH);
      return duration;
    }

    long getDistance() {
      long distacne_cm = getEchoTiming()/29/2;
      return distacne_cm;
    }

     
    Код (C++):

    int speed = 255;
    int trigPin = 4;
    int echoPin = 2;
    int motAF = 5;
    int motBF = 6;
    int motAB = 9;
    int motBB = 10;
    int analogPin = 1;
    int linePin = 3;


    long distance;
    long randNumber;

    int line1;

    void setup() {
    pinMode(motAF, OUTPUT);
    pinMode(motBF, OUTPUT);
    pinMode(motAB, OUTPUT);
    pinMode(motBB, OUTPUT);
     
    pinMode(trigPin,OUTPUT);
    pinMode(echoPin,INPUT);

      pinMode(linePin,INPUT);

    randomSeed(analogRead(0));
    }

    void loop() {

    speed = analogRead(analogPin) / 4;

    line1 = digitalRead(linePin);
     
    if (line1 > 0)
       {
       analogWrite(motBF, speed);
       analogWrite(motAF, 0);
       }
    else
       {
       analogWrite(motAF, speed);
       analogWrite(motBF, 0);    
       }
    delay(100);
    }

     
     
    egordorichev нравится это.
  2. darkavenger

    darkavenger Гик



    Код (C++):

    int speed = 255;    // скорость робота
    int trigPin = 4;    // передатчик датчика расстояния
    int echoPin = 2;    // приемник датчика расстояния
    int motAF = 5;        // мотор А вперел
    int motBF = 6;        // мотор В вперел
    int motAB = 9;        // мотор А назад
    int motBB = 10;        // мотор В назад
    int analogPin = 1;    // потенциометр
    int linePin1 = 3;    // датчик линии спереди слева
    int linePin2 = 8;    // датчик линии спереди справа
    int linePin3 = 11;    // датчик линии сзади слева
    int linePin4 = 12;    // датчик линии сзади справа
    int buttonPin = 7;    // кнопка
    int buzzerPin = 13;

    int ring = 75;

    long distance;
    long randNumber;

    long enemy = 0;

    boolean line1;
    boolean line2;
    boolean line3;
    boolean line4;

    boolean mybutton = false;
    boolean buttonpress = false;

    boolean newstate;

    // mystate = 0 - ожидание нажатия кнопки
    // mystate = 1 - поиск соперника
    // mystate = 2 - выталкиваем контролируя линию и наличие соперника
    // mystate = 3 - отъезжаем назад если обнаружена линия спереди слева
    // mystate = 4 - отъезжаем назад если обнаружена линия спереди справа
    // mystate = 5 - увиливаем вбок если обнаружена линия сзади слева
    // mystate = 6 - увиливаем вбок если обнаружена линия сзади справа
    int mystate = 0;


    void setup() {
    pinMode(motAF, OUTPUT);
    pinMode(motBF, OUTPUT);
    pinMode(motAB, OUTPUT);
    pinMode(motBB, OUTPUT);
     
    pinMode(trigPin,OUTPUT);
    pinMode(echoPin,INPUT);

    pinMode(linePin1,INPUT);
    pinMode(linePin2,INPUT);
    pinMode(linePin3,INPUT);
    pinMode(linePin4,INPUT);

    pinMode(buttonPin,INPUT_PULLUP);

    randomSeed(analogRead(0));

    Serial.begin(9600);

    Serial.println("SUMO BOT start");

    }

    void loop() {
       
    speed = analogRead(analogPin) / 4;

    line1 = digitalRead(linePin1);
    line2 = digitalRead(linePin2);
    line3 = !(digitalRead(linePin3));
    line4 = !(digitalRead(linePin4));

    delay (2);
     
    if (line1 && digitalRead(linePin1)) line1 = true; else line1 = false;
    if (line2 && digitalRead(linePin2)) line2 = true; else line2 = false;
    if (line3 && !(digitalRead(linePin3))) line3 = true; else line3 = false;
    if (line4 && !(digitalRead(linePin4))) line4 = true; else line4 = false;

    delay (2);
     
    if (line3 && !(digitalRead(linePin3))) line3 = true; else line3 = false;
    if (line4 && !(digitalRead(linePin4))) line4 = true; else line4 = false;

    // line1 = false;
    // line2 = false;
    line3 = false;
    line4 = false;

    buttonpress = digitalRead(buttonPin);

    //line3 = !line3;
    //line4 = !line4;

    distance = getDistance();

    Serial.print("line: ");
    Serial.print(line1);
    Serial.print(line2);
    Serial.print(line3);
    Serial.print(line4);
    Serial.print(" distance: ");
    Serial.println(distance);
    Serial.print(" button: ");
    Serial.print(mybutton);
    Serial.println(buttonpress);

    newstate = false;

    if (!buttonpress)
       {
       buzzer();
       delay(1000);
       if (mystate != 0) newstate = true;
       mystate = 0;  
       mybutton = !mybutton;
       }

    if (distance <= ring && enemy == 0) enemy++;
    if (enemy > 0) enemy++;
    if (enemy > 8) enemy = 0;

    if (distance > ring && !line1 && !line2 && !line3 && !line4 && !newstate && mybutton && enemy == 0)
       {
       if (mystate != 1) newstate = true;
       mystate = 1;
       enemy = 0;
       }
     
    if (!line1 && !line2 && !line3 && !line4 && !newstate && mybutton && enemy > 0)
       {
       if (mystate != 2) newstate = true;
       mystate = 2;
       }

      if (line1 && !newstate && mybutton)
       {
       if (mystate != 3) newstate = true;
       mystate = 3;
       enemy = 0;
       }

      if (line2 && !newstate && mybutton)
       {
       if (mystate != 4) newstate = true;
       mystate = 4;
       enemy = 0;
       }
     
      if (line3 && !newstate && mybutton)
       {
       if (mystate != 5) newstate = true;
       mystate = 5;
       enemy = 0;
       }

      if (line4 && !newstate && mybutton)
       {
       if (mystate != 6) newstate = true;
       mystate = 6;
       enemy = 0;
       }  

    if (newstate)
       {
        Serial.print("new state: ");
        Serial.println(mystate);

        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);
       
        buzzer ();
        if (distance > ring / 2) buzzer ();
        if (distance > ring) buzzer ();
        if (distance > ring * 2) buzzer ();  

        //delay (1000);
       }

        Serial.print("current state: ");
        Serial.println(mystate);

    switch (mystate) {
      case 0:
        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);
        break;
      case 1:
        analogWrite(motAB, speed / 3);
        analogWrite(motBF, speed / 3);
        delay(10);  
        break;
      case 2:  
        analogWrite(motAF, speed);
        analogWrite(motBF, speed);
        delay(40);
        break;
      case 3:  
        analogWrite(motAB, speed);
        analogWrite(motBB, speed / 1.4);
        buzzer();
        delay(1000);
        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);  
        break;
      case 4:  
        analogWrite(motAB, speed / 1.4);
        analogWrite(motBB, speed);
        buzzer();
        delay(1000);
        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);
        break;
      case 5:  
        analogWrite(motAF, speed);
        analogWrite(motBF, speed / 1.4);
        buzzer();
        buzzer();  
        delay(1000);
        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);
        break;
      case 6:  
        analogWrite(motAF, speed);
        analogWrite(motBF, speed / 1.4);
        buzzer();
        buzzer();
        delay(1000);
        analogWrite(motAF, 0);
        analogWrite(motBF, 0);
        analogWrite(motAB, 0);
        analogWrite(motBB, 0);
        break;

      }

    delay(10);

    }

    long getEchoTiming() {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      long duration = pulseIn(echoPin,HIGH);
      return duration;
    }

    long getDistance() {
      long distacne_cm = getEchoTiming()/29/2;
      //distacne_cm = (distacne_cm + getEchoTiming()/29/2) / 2;
      //if (distacne_cm > 700) distacne_cm = 700;
      return distacne_cm;
    }

    void buzzer()  {
      digitalWrite(buzzerPin, HIGH);
      delay(25);              
      digitalWrite(buzzerPin, LOW);
      delay(25);
    }

     
     
    Последнее редактирование модератором: 11 дек 2020
    egordorichev нравится это.
  3. Unixon

    Unixon Оракул Модератор

    А что играет на фоне? Очень симпатичный chiptune :)
     
  4. darkavenger

    darkavenger Гик

  5. Андрей01

    Андрей01 Нерд

    Молодцы, только прошло уже 8 лет.
     
  6. AlexU

    AlexU Гуру

    Молодец, что поднял тему семилетней давности.
    Получаешь награду -- "Некропостер шестого разряда".
     
    NikitOS, sanik, Daniil и 2 другим нравится это.