Инструменты пользователя

Инструменты сайта


kiber_tc_2018

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
kiber_tc_2018 [2019/03/26 20:00]
super_admin [Вариант 2.1. Простейший релейный регулятор движения по линии]
kiber_tc_2018 [2019/04/22 19:35]
super_admin [Вариант 2.1. Простейший релейный регулятор движения по линии + ультразвуковой датчик препятствия (промежуточный вариант, требует доработки)]
Строка 3: Строка 3:
 ===== Основы электроники ===== ===== Основы электроники =====
   * [[electronics|Основы электроники]]   * [[electronics|Основы электроники]]
 +  * [[http://​www.radio-samodel.ru/​kontur.html]] - Нужная теория
 +  * [[https://​phet.colorado.edu/​en/​simulation/​ohms-law]] - модели,​ симуляторы
   * [[http://​www.intepra.ru/​wiki/​doku.php?​id=electronics#​%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F|Теория]]   * [[http://​www.intepra.ru/​wiki/​doku.php?​id=electronics#​%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D1%8F|Теория]]
   * [[http://​wiki.amperka.ru/​%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:​%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%81%D1%85%D0%B5%D0%BC%D1%8B|Принципиальные схемы]]   * [[http://​wiki.amperka.ru/​%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:​%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%81%D1%85%D0%B5%D0%BC%D1%8B|Принципиальные схемы]]
Строка 507: Строка 509:
 </​code>​ </​code>​
  
 +
 +==== Релейный регулятор датчиков линии на драйвере L293D (обновленная версия) ====
 +
 +<​code>​
 +
 +
 +
 +#define PWMA 6  // выходы arduino
 +#define PWMB 3
 +#define AIN1 7
 +#define AIN2 8
 +#define BIN1 2
 +#define BIN2 4
 + 
 + 
 +#define lS 12
 +#define rS 11 
 + 
 +int min_speed = 120;
 +int max_speed = 255;
 +int n_speed = 180;
 +int dif = 180;
 +
 +uint8_t lSState;
 +uint8_t rSState;
 +
 +int state;
 +int prevState;
 +int readyState = 0;
 +
 +void resetState(int st){
 +  prevState = state;
 +  state = st;
 +}
 +
 + 
 +//int state;
 + void setup() {
 + 
 +  /* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */
 +  pinMode(PWMA,​OUTPUT);​
 +  pinMode(AIN1,​OUTPUT);​
 +  pinMode(AIN2,​OUTPUT);​
 +  pinMode(PWMB,​OUTPUT);​
 +  pinMode(BIN1,​OUTPUT);​
 +  pinMode(BIN2,​OUTPUT);​
 +  pinMode(lS,​INPUT);​
 +  pinMode(rS,​INPUT);​
 +  Serial.begin(9600);​
 +   while (readyState == 0) {
 +    testSensors();​
 +    if (prevState != 11)
 +      readyState = 1;
 +      delay(1000);​
 +  }
 + ​delay(2000);​
 +
 +}
 +
 +void testSensors(){
 +  lSState = digitalRead(lS);​
 +  rSState = digitalRead(rS);​
 +   //​Serial.println(lSState);​
 +   //​Serial.println(rSState);​
 +   //​Serial.println(""​);  ​
 +    ​
 +   if (lSState == 0 && rSState == 0  ){
 +          resetState(0);​
 +       //​goForward(n_speed);​
 +   }
 +   if (lSState == 1 && rSState == 0  ){
 +       ​resetState(10);​
 +       //​goForward(n_speed);​
 +   }
 +  // if (current_dist <= dangerous_dist ){
 +  //    resetState(1);​
 +      //​applyBrakes ();
 +  // }
 +   if (lSState == 1 && rSState == 1  ){
 +     //if (readyState == 0)
 +       ​resetState(11);​
 +       //​veerRight(n_speed,​ dif);
 +   }
 +   if (lSState == 0 && rSState == 1   ){
 +       ​resetState(1);​
 +       //​veerLeft(n_speed,​ dif);
 +   ​}  ​
 +  ​
 +}
 +
 +
 + 
 +void loop() {
 +  testSensors();​
 +  updateMotion(n_speed,​ dif);
 + 
 + // centralLineFollower();​
 + 
 +delay(1);
 + 
 +  }
 +
 +void updateMotion(int sp, int d){
 +    switch ( state ) {
 +    case 0:
 +      if (prevState == 1)
 +        veerLeft(sp,​ d);
 +      else if (prevState == 10)
 +        veerRight(sp,​ d);
 +      break;
 +    case 1:
 +      // Code
 +      goForward(sp);​
 +      break;
 +    case 10:
 +      // Code
 +      goForward(sp);​
 +      break;
 +    case 11:
 +      // Code
 +      if (prevState == 10)
 +        veerRight(sp,​ d);
 +      else if (prevState == 1)
 +        veerLeft(sp,​ d);
 +      break;
 +    }
 +  ​
 +}
 +
 + void leftLineFollower(){
 +    //​goForward(n_speed);​
 +    //​applyBrakes ();
 +    //​veerRight(n_speed,​ dif);
 +    //​veerLeft(n_speed,​ dif);
 +
 +}  ​
 +void centralLineFollower(){
 + 
 +}
 + 
 +void goForward (int v)
 +{
 +  digitalWrite (AIN1,​HIGH);​
 +  digitalWrite (AIN2,LOW);
 +  analogWrite(PWMA,​v);​
 +  digitalWrite (BIN1,​HIGH);​
 +  digitalWrite (BIN2,LOW);
 +  analogWrite(PWMB,​v); ​
 +}
 + 
 +void goBackward (int v)
 +{
 +  digitalWrite (AIN1,LOW);
 +  digitalWrite (AIN2,​HIGH);​
 +  analogWrite(PWMA,​v);​
 +  digitalWrite (BIN1,LOW);
 +  digitalWrite (BIN2,​HIGH);​
 +  analogWrite(PWMB,​v); ​
 +}
 + 
 +void rotateRight (int v)
 +{
 +  digitalWrite (AIN1,​HIGH);​
 +  digitalWrite (AIN2,LOW);
 +  analogWrite(PWMA,​v);​
 +  digitalWrite (BIN1,LOW);
 +  digitalWrite (BIN2,​HIGH);​
 +  analogWrite(PWMB,​v); ​
 +}
 + 
 +void rotateLeft (int v)
 +{
 +  digitalWrite (AIN1,LOW);
 +  digitalWrite (AIN2,​HIGH);​
 +  analogWrite(PWMA,​v);​
 +  digitalWrite (BIN1,​HIGH);​
 +  digitalWrite (BIN2,LOW);
 +  analogWrite(PWMB,​v); ​
 +}
 + 
 +void veerLeft (int v, int d)
 +{
 +  digitalWrite (AIN1,​HIGH);​
 +  digitalWrite (AIN2,LOW);
 +  analogWrite(PWMA,​v);​
 +  digitalWrite (BIN1,​HIGH);​
 +  digitalWrite (BIN2,LOW);
 +  analogWrite(PWMB,​v -d); 
 +}
 + 
 +void veerRight (int v, int d)
 +{
 +  digitalWrite (AIN1,​HIGH);​
 +  digitalWrite (AIN2,LOW);
 +  analogWrite(PWMA,​v -d);
 +  digitalWrite (BIN1,​HIGH);​
 +  digitalWrite (BIN2,LOW);
 +  analogWrite(PWMB,​v ); 
 +}
 + 
 +void applyBrakes ()
 +{
 +  digitalWrite (AIN1,​HIGH);​
 +  digitalWrite (AIN2,​HIGH);​
 +  analogWrite(PWMA,​255);​
 +  digitalWrite (BIN1,​HIGH);​
 +  digitalWrite (BIN2,​HIGH);​
 +  analogWrite(PWMB,​255); ​
 +}
 +
 +</​code>​
 ==== Управление питанием посредством кнопки ==== ==== Управление питанием посредством кнопки ====
  
Строка 695: Строка 908:
  
  
- 
-==== Вариант 2 ==== 
- 
- 
-<code C++> 
- 
-#define PWMA 9  // выходы arduino 
-#define PWMB 10 
-#define AIN1 6 
-#define AIN2 7 
-#define BIN1 5 
-#define BIN2 4 
-#define STBY 13  
- 
-void setup() { 
- 
-/* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */ 
-pinMode(PWMA,​OUTPUT);​ 
-pinMode(AIN1,​OUTPUT);​ 
-pinMode(AIN2,​OUTPUT);​ 
-pinMode(PWMB,​OUTPUT);​ 
-pinMode(BIN1,​OUTPUT);​ 
-pinMode(BIN2,​OUTPUT);​ 
-pinMode(STBY,​OUTPUT);​ 
-delay(5000);​ 
- 
-} 
- 
-void loop() { 
-    
-  startUp(); 
-  goForward();​ 
-  delay(1500);​ 
-  turnAround();​ 
-  goForward();​ 
-  delay(1500);​ 
-  turnAround();​ 
-  goBackward();​ 
-  delay(1500);​ 
-  rotateLeft();​ 
-  delay(560); 
-  rotateRight();​ 
-  delay(2240);​ 
-  goForward();​ 
-  delay(1000);​ 
-  applyBrakes();​ 
-  delay(2000);​ 
-  } 
- 
-/* Определение функций */ 
-/* Опытным путем было выяснено,​ что при коэффициенте ШИМ равном 233 */ 
-/* для левого двигателя и 255 для правого позволяют роботу */ 
-/* двигаться по прямой на полной скорости. Тесты показали,​ что робот */ 
-/* совершает 27 оборотов вокруг своей оси в минуту при вращении двигателей */ 
-/* в противоположные стороны при полном заполнении ШИМ. Эта величина  */ 
-/* была использована для определения времени,​ */ 
-/* за которое робот повернется на 90, 180 и 360 градусов. */ 
- 
-void goForward () 
-{ 
-  digitalWrite (AIN1,​HIGH);​ 
-  digitalWrite (AIN2,LOW); 
-  analogWrite(PWMA,​155);​ 
-  digitalWrite (BIN1,​HIGH);​ 
-  digitalWrite (BIN2,LOW); 
-  analogWrite(PWMB,​155);​  
-} 
- 
-void goBackward () 
-{ 
-  digitalWrite (AIN1,LOW); 
-  digitalWrite (AIN2,​HIGH);​ 
-  analogWrite(PWMA,​155);​ 
-  digitalWrite (BIN1,LOW); 
-  digitalWrite (BIN2,​HIGH);​ 
-  analogWrite(PWMB,​155);​  
-} 
- 
-void rotateRight () 
-{ 
-  digitalWrite (AIN1,​HIGH);​ 
-  digitalWrite (AIN2,LOW); 
-  analogWrite(PWMA,​100);​ 
-  digitalWrite (BIN1,LOW); 
-  digitalWrite (BIN2,​HIGH);​ 
-  analogWrite(PWMB,​100);​  
-} 
- 
-void rotateLeft () 
-{ 
-  digitalWrite (AIN1,LOW); 
-  digitalWrite (AIN2,​HIGH);​ 
-  analogWrite(PWMA,​100);​ 
-  digitalWrite (BIN1,​HIGH);​ 
-  digitalWrite (BIN2,LOW); 
-  analogWrite(PWMB,​100);​  
-} 
- 
-void veerLeft () 
-{ 
-  digitalWrite (AIN1,​HIGH);​ 
-  digitalWrite (AIN2,LOW); 
-  analogWrite(PWMA,​100);​ 
-  digitalWrite (BIN1,​HIGH);​ 
-  digitalWrite (BIN2,LOW); 
-  analogWrite(PWMB,​155);​  
-} 
- 
-void veerRight () 
-{ 
-  digitalWrite (AIN1,​HIGH);​ 
-  digitalWrite (AIN2,LOW); 
-  analogWrite(PWMA,​155);​ 
-  digitalWrite (BIN1,​HIGH);​ 
-  digitalWrite (BIN2,LOW); 
-  analogWrite(PWMB,​100);​  
-} 
- 
-void applyBrakes () 
-{ 
-  digitalWrite (AIN1,​HIGH);​ 
-  digitalWrite (AIN2,​HIGH);​ 
-  analogWrite(PWMA,​155);​ 
-  digitalWrite (BIN1,​HIGH);​ 
-  digitalWrite (BIN2,​HIGH);​ 
-  analogWrite(PWMB,​155);​  
-} 
- 
-void startUp () 
-{ 
-  digitalWrite(STBY,​HIGH);​ 
-} 
- 
-void turnAround() 
-{ 
-  rotateLeft();​ 
-  delay(5000);​ 
-} 
- 
-void shutDown () 
-{ 
-  digitalWrite(STBY,​LOW);​ 
-} 
- 
-</​code>​ 
  
  
Строка 907: Строка 975:
    
   }   }
-void testmove(){ +
-  //​startUp();​ +
-  //​goForward();​ +
-  //​delay(1500);​ +
-  //​turnAround();​ +
-  //​goForward();​ +
-  //​delay(1500);​ +
-  //​turnAround();​ +
-  //​goBackward();​ +
-  //​delay(1500);​ +
-  //​rotateLeft();​ +
-  //​delay(560);​ +
-  //​rotateRight();​ +
-  //​delay(2240);​ +
- // goForward();​ +
- // delay(1000);​ +
-  //​applyBrakes();​ +
- // delay(2000);​ +
-  +
-}+
    
 void goForward (int v) void goForward (int v)
Строка 1003: Строка 1052:
 } }
    
-//void turnAround() +
-//{ +
-//  rotateLeft();​ +
-//  delay(1370);​ +
-//}+
    
 void shutDown () void shutDown ()
Строка 1016: Строка 1061:
 </​code>​ </​code>​
  
- +==== Реализация машины состояний при движении по линии ====
- +
- +
-==== Вариант 2.1. Простейший релейный регулятор ​движения по линии ====+
  
  
 <code C++> <code C++>
- 
    
-#define PWMA  // выходы arduino+#define PWMA 11  // выходы arduino
 #define PWMB 10 #define PWMB 10
 #define AIN1 6 #define AIN1 6
Строка 1032: Строка 1073:
 #define BIN2 4 #define BIN2 4
 #define STBY 13  #define STBY 13 
 + 
 +#define lS 9
 +#define rS 8 
 + 
 +int min_speed = 120;
 +int max_speed = 255;
 +int n_speed = 200;
 +int dif = 200;
  
-#define lS 8 // левый датчик линии +uint8_t lSState; 
-#define rS 12 +uint8_t rSState;
  
-int min_speed = 100+int state
-int max_speed = 255+int prevState
-int n_speed = 110; +int readyState ​= 0;
-int dif = 110; +
-uint8_t lSState=0;​ +
-uint8_t rSState=0;+
  
 +void resetState(int st){
 +  prevState = state;
 +  state = st;
 +}
  
 + 
 //int state; //int state;
 + void setup() {
    
-void setup() { +  ​/* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */ 
-  +  pinMode(PWMA,​OUTPUT);​ 
-/* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */ +  pinMode(AIN1,​OUTPUT);​ 
-pinMode(PWMA,​OUTPUT);​ +  pinMode(AIN2,​OUTPUT);​ 
-pinMode(AIN1,​OUTPUT);​ +  pinMode(PWMB,​OUTPUT);​ 
-pinMode(AIN2,​OUTPUT);​ +  pinMode(BIN1,​OUTPUT);​ 
-pinMode(PWMB,​OUTPUT);​ +  pinMode(BIN2,​OUTPUT);​ 
-pinMode(BIN1,​OUTPUT);​ +  pinMode(lS,​INPUT);​ 
-pinMode(BIN2,​OUTPUT);​ +  pinMode(rS,​INPUT);​ 
-pinMode(STBY,​OUTPUT);​ +  Serial.begin(9600); 
-pinMode(lS,​INPUT);​ +   while (readyState == 0) { 
-pinMode(rS,​INPUT);​ +    testSensors();​ 
-Serial.begin(9600);​ +    if (prevState != 11) 
-startUp();+      readyState = 1; 
 +      delay(1000);​ 
 +  } 
 + ​delay(2000); 
 + ​startUp();​
 } }
-  
-void loop() { 
-   ​lSState = digitalRead(lS);​ 
-   ​rSState = digitalRead(rS);​ 
-   ​Serial.println(lSState);​ 
-   ​Serial.println(rSState);​ 
-   ​Serial.println(""​); ​   
  
-    +void testSensors(){ 
-   if (lSState == 0 && rSState == 0){ +  lSState = digitalRead(lS);​ 
-    goForward(n_speed);​+  rSState = digitalRead(rS);​ 
 +   //​Serial.println(lSState);​ 
 +   //​Serial.println(rSState);​ 
 +   //​Serial.println(""​); ​  
 +     
 +   if (lSState == 0 && rSState == 0  ){ 
 +          ​resetState(0);​ 
 +       //goForward(n_speed);​
    }    }
-    +   if (lSState == 1 && rSState == 0  ​){ 
-   if (lSState == 1 && rSState == 1){ +       resetState(10);​ 
-    ​applyBrakes ​();+       //​goForward(n_speed);
    }    }
-   if (lSState == 1 && rSState == 0){ +  // if (current_dist <= dangerous_dist ){ 
-    veerRight(n_speed,​ dif);+  //    resetState(1);​ 
 +      //​applyBrakes (); 
 +  // } 
 +   if (lSState == 1 && rSState == 1  ​){ 
 +     //if (readyState == 0) 
 +       ​resetState(11);​ 
 +       //veerRight(n_speed,​ dif);
    }    }
-   if (lSState == 0 && rSState == 1){ +   if (lSState == 0 && rSState == 1   ​){ 
-    veerLeft(n_speed,​ dif); +       resetState(1);​ 
-   ​} ​  ​+       //veerLeft(n_speed,​ dif); 
 +   ​} ​  
 +   
 +
  
-delay(10); +  
-   ​+void loop() { 
 +  testSensors();​ 
 +  updateMotion(n_speed,​ dif); 
 +  
 + // centralLineFollower();​ 
 +  
 +  //delay(1); 
 + 
   }   }
-void testmove(){ + 
-  //​startUp(); +void updateMotion(int sp, int d){ 
-  //​goForward(); +    ​switch ​state { 
-  //delay(1500); +    case 0: 
-  //​turnAround(); +      if (prevState == 1
-  //​goForward(); +        //veerLeft(sp, d); 
-  //delay(1500); +        ​veerRight(sp, d); 
-  //​turnAround(); +      else if (prevState == 10
-  //goBackward(); +        //veerRight(sp, d); 
-  //delay(1500); +        ​veerLeft(sp, d); 
-  //rotateLeft(); +      ​break;​ 
-  //​delay(560); +    case 1: 
-  //​rotateRight(); +      ​// Code 
-  ​//delay(2240); +      goForward(sp); 
- // goForward();​ +      ​break;​ 
- // ​delay(1000); +    case 10: 
-  //applyBrakes(); +      ​// Code 
- // ​delay(2000); +      goForward(sp); 
-   ​+      ​break;​ 
 +    case 11: 
 +      ​// Code 
 +      if (prevState == 10
 +        ​veerRight(sp, d); 
 +      else if (prevState == 1) 
 +        veerLeft(sp,​ d); 
 +      break; 
 +    } 
 +  ​ 
 +
 + 
 + void leftLineFollower(){ 
 +    //​goForward(n_speed); 
 +    //applyBrakes ​(); 
 +    //veerRight(n_speed, dif); 
 +    //veerLeft(n_speed, dif); 
 + 
 +}   
 +void centralLineFollower(){ 
 + 
 } }
    
Строка 1183: Строка 1276:
 } }
    
-//void turnAround() +
-//{ +
-//  rotateLeft();​ +
-//  delay(1370);​ +
-//}+
    
 void shutDown () void shutDown ()
Строка 1195: Строка 1284:
  
 </​code>​ </​code>​
 +
 +
 +
 +
 +==== Вариант 2.1. Простейший релейный регулятор движения по линии + ультразвуковой датчик препятствия (промежуточный вариант,​ требует доработки) ====
  
  
 <code C++> <code C++>
  
 + 
 #include <​Ping.h>​ #include <​Ping.h>​
  
Строка 1210: Строка 1305:
 #define STBY 13  #define STBY 13 
    
-#define lS 9 // левый датчик линии+#define lS 9
 #define rS 8  #define rS 8 
 +
 +int distance = 10;
 +int ping_distance = 400;
 +
 +Ping ping = Ping(2);
 +
 +uint32_t previousMillis = 0;
 +uint16_t timePeriod = 50; 
 +
    
-int min_speed = 100;+int min_speed = 120;
 int max_speed = 255; int max_speed = 255;
-int n_speed = 170+int n_speed = 220
-int dif = 110+int dif = 220; 
-uint8_t lSState=0+  
-uint8_t rSState=0;​ +uint8_t lSState; 
-uint32_t previousMillis ​0+uint8_t rSState
-uint8_t timePeriod ​100+  
 +int state; 
 +int prevState;​ 
 +int readyState ​= 0; 
 +  
 +void resetState(int st){ 
 +  prevState ​state
 +  ​state ​st; 
 +}
  
-int dist = 500; 
    
 //int state; //int state;
- + void setup() {
-Ping ping = Ping(2); +
-  +
-void setup() {+
    
   /* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */   /* Настроить все 7 выводов на выходы,​ идущие к драйверу TB6612FNG */
Строка 1237: Строка 1345:
   pinMode(BIN1,​OUTPUT);​   pinMode(BIN1,​OUTPUT);​
   pinMode(BIN2,​OUTPUT);​   pinMode(BIN2,​OUTPUT);​
-  pinMode(STBY,​OUTPUT);​ 
   pinMode(lS,​INPUT);​   pinMode(lS,​INPUT);​
   pinMode(rS,​INPUT);​   pinMode(rS,​INPUT);​
   Serial.begin(9600);​   Serial.begin(9600);​
-  startUp(); +   while (readyState == 0) { 
 +    testSensors(); 
 +    if (prevState != 11) 
 +      readyState = 1; 
 +      delay(1000);​ 
 +  } 
 + ​delay(2000);​ 
 + ​startUp();​
 } }
 +/* 
 +void checkTimer(){ 
 +  uint32_t currentMillis = millis(); 
 +  if (currentMillis - previousMillis >= timePeriod){ 
 +    Serial.println(millis());​ 
 +  previousMillis = currentMillis;​ 
 +  } 
 +
 +*/ 
 +void testSensors(){ 
 +  lSState = digitalRead(lS);​ 
 +  rSState = digitalRead(rS);​ 
 +   //​Serial.println(lSState);​ 
 +   //​Serial.println(rSState);​ 
 +   //​Serial.println(""​); ​  
 +  
 +   if (lSState == 0 && rSState == 0  ){ 
 +          resetState(0);​ 
 +       //​goForward(n_speed);​ 
 +   } 
 +   if (lSState == 1 && rSState == 0  ){ 
 +       ​resetState(10);​ 
 +       //​goForward(n_speed);​ 
 +   } 
 +  // if (current_dist <= dangerous_dist ){ 
 +  //    resetState(1);​ 
 +      //​applyBrakes (); 
 +  // } 
 +   if (lSState == 1 && rSState == 1  ){ 
 +     //if (readyState == 0) 
 +       ​resetState(11);​ 
 +       //​veerRight(n_speed,​ dif); 
 +   } 
 +   if (lSState == 0 && rSState == 1   ){ 
 +       ​resetState(1);​ 
 +       //​veerLeft(n_speed,​ dif); 
 +   ​} ​  
 +  
 +
 + 
 void ping_fire(){ void ping_fire(){
   ping.fire();​   ping.fire();​
   //​Serial.println("​***"​); ​   //​Serial.println("​***"​); ​
 } }
 + 
 void loop() { void loop() {
-   uint32_t currentMillis = millis(); +  // time ===================== 
-   ​if (currentMillis - previousMillis >= timePeriod){+  ​uint32_t currentMillis = millis(); 
 +  if (currentMillis - previousMillis >= timePeriod){ 
 +    //​Serial.println(millis());​ 
 +    //​Serial.println(ping.centimeters());​ 
 +    ping_distance = ping.centimeters();​
     ping_fire();​     ping_fire();​
     previousMillis = currentMillis;​     previousMillis = currentMillis;​
-   +  ​
- +  //​======================= 
-   ​dist ​ping.centimeters();​ +  ​testSensors(); 
-   ​lSState ​digitalRead(lS);​ +  ​if ​(ping_distance > distance){ 
-   ​rSState ​digitalRead(rS);​ +    ​updateMotion(n_speed, dif); 
-   Serial.println(dist); +  } else { 
-   /* +    applyBrakes ​(); 
-   ​Serial.println(lSState); +  }
-   Serial.println(rSState); +
-   Serial.println(""​);   ​ +
- */+
    
-   ​if ​(lSState == 0 && rSState == 0 && dist > 20 ){ + // centralLineFollower(); 
-       goForward(n_speed); +  
-   } +  //delay(1);
    
-   if (lSState == 1 && rSState == 1  ||  dist <= 20 ){ 
-    applyBrakes (); 
-   } 
-   if (lSState == 1 && rSState == 0 && dist > 20 ){ 
-    veerRight(n_speed,​ dif); 
-   } 
-   if (lSState == 0 && rSState == 1 && dist > 20 ){ 
-    veerLeft(n_speed,​ dif); 
-   ​} ​   
- 
- ​delay(10);​ 
   }   }
-void testmove(){ +  
-  //​startUp(); +void updateMotion(int sp, int d){ 
-  //​goForward(); +    ​switch ​state { 
-  //delay(1500); +    case 0: 
-  //​turnAround(); +      if (prevState == 1
-  //​goForward(); +        //veerLeft(sp, d); 
-  //delay(1500); +        ​veerRight(sp, d); 
-  //​turnAround(); +      else if (prevState == 10
-  //goBackward(); +        //veerRight(sp, d); 
-  //delay(1500); +        ​veerLeft(sp, d); 
-  //rotateLeft(); +      ​break;​ 
-  //​delay(560); +    case 1: 
-  //​rotateRight(); +      ​// Code 
-  //​delay(2240); +      goForward(sp); 
- // goForward();​ +      ​break;​ 
- // ​delay(1000); +    case 10: 
-  //applyBrakes(); +      ​// Code 
- // ​delay(2000);+      goForward(sp); 
 +      ​break;​ 
 +    case 11: 
 +      ​// Code 
 +      if (prevState == 10
 +        ​veerRight(sp, d); 
 +      else if (prevState == 1
 +        ​veerLeft(sp, d); 
 +      ​break;​ 
 +    } 
 +  
 +
 +  
 + void leftLineFollower(){ 
 +    ​//​goForward(n_speed); 
 +    //applyBrakes ​(); 
 +    //veerRight(n_speed, dif); 
 +    //veerLeft(n_speed, dif); 
 +  
 +}   
 +void centralLineFollower(){
    
 } }
Строка 1380: Строка 1541:
 } }
    
-//void turnAround() + 
-//{ +
-//  rotateLeft();​ +
-//  delay(1370);​ +
-//}+
    
 void shutDown () void shutDown ()
Строка 1390: Строка 1547:
   digitalWrite(STBY,​LOW);​   digitalWrite(STBY,​LOW);​
 } }
 +
 +/*
 +В библиотеке Ping.cpp ​
 +вместо строки
 +  _duration = pulseIn(_pin,​ HIGH);
 +следует использовать
 +  _duration = pulseIn(_pin,​ HIGH, 40000);
 +*/
 +
 </​code>​ </​code>​
 +
 +
 +==== Простой таймер (прерывание по таймеру) ====
 +
 +<code C++>
 +uint32_t previousMillis = 0;
 +uint16_t timePeriod = 1500; 
 +
 +void setup() {
 +  // put your setup code here, to run once:
 +  Serial.begin(9600);​
 +}
 +
 +void loop() {
 +   ​uint32_t currentMillis = millis();
 +   if (currentMillis - previousMillis >= timePeriod){
 +      Serial.println(millis());​
 +    previousMillis = currentMillis;​
 +   }
 +}
 +</​code>​
 +
 ==== Ультразвуковой датчик ==== ==== Ультразвуковой датчик ====
  
   * [[http://​playground.arduino.cc/​Code/​Ping]]   * [[http://​playground.arduino.cc/​Code/​Ping]]
   * [[http://​embeddedlab.csuohio.edu/​RoboticSwarms/​ultrasonic_sensors.html]]   * [[http://​embeddedlab.csuohio.edu/​RoboticSwarms/​ultrasonic_sensors.html]]
 +  * [[http://​arduino.ru/​forum/​programmirovanie/​nestabilnaya-rabota-uz-datchika]] - Форум: "​Нестабильная работа УЗ датчика"​
 +==== Указатели в C для Ардуино ====
 +
 +  * [[http://​mypractic.ru/​urok-15-ukazateli-v-c-dlya-arduino-preobrazovanie-raznyx-tipov-dannyx-v-bajty.html]]
  
  
kiber_tc_2018.txt · Последние изменения: 2019/11/20 23:06 — super_admin