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

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


kiber_tc_2018

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Следующая версия Следующая версия справа и слева
kiber_tc_2018 [2019/02/18 15:09]
super_admin [Характеристика двигателя постоянного тока Makeblock 81340 180 Optical Encoder Motor]
kiber_tc_2018 [2019/04/29 17:58]
super_admin [Ультразвуковой датчик]
Строка 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|Принципиальные схемы]]
Строка 9: Строка 11:
   * [[http://​wiki.amperka.ru/​%D1%81%D1%85%D0%B5%D0%BC%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:​%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C-%D0%BD%D0%B0%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F|Делитель напряжения (статья)]]   * [[http://​wiki.amperka.ru/​%D1%81%D1%85%D0%B5%D0%BC%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0:​%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%D0%BB%D1%8C-%D0%BD%D0%B0%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%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%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D1%82%D0%BE%D1%80| Конденсаторы]] ​   * [[http://​wiki.amperka.ru/​%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:​%D0%BA%D0%BE%D0%BD%D0%B4%D0%B5%D0%BD%D1%81%D0%B0%D1%82%D0%BE%D1%80| Конденсаторы]] ​
 +  * [[https://​youtu.be/​msJQH9pONKk]] Урок 16. Как работает RC-цепь ​
   * [[https://​youtu.be/​GWfY0My11v8]] - Ёмкостное сопротивление   * [[https://​youtu.be/​GWfY0My11v8]] - Ёмкостное сопротивление
   * [[http://​wiki.amperka.ru/​%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:​%D0%B1%D0%B8%D0%BF%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B9-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%81%D1%82%D0%BE%D1%80 | Биполярные транзисторы]]   * [[http://​wiki.amperka.ru/​%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-arduino:​%D0%B1%D0%B8%D0%BF%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B9-%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%81%D1%82%D0%BE%D1%80 | Биполярные транзисторы]]
Строка 16: Строка 19:
   * [[http://​shemopedia.ru/​tahometr-na-arduino.html]] - Тахометр на Arduino   * [[http://​shemopedia.ru/​tahometr-na-arduino.html]] - Тахометр на Arduino
   * https://​m.habr.com/​post/​432778/ ​   * https://​m.habr.com/​post/​432778/ ​
 +  * [[http://​robocraft.ru/​blog/​arduino/​529.html]] ИК-датчик препятствий для Arduino на базе фототранзистора
  
  ===== Электроизмерительные приборы на Arduino =====  ===== Электроизмерительные приборы на Arduino =====
Строка 27: Строка 31:
   * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-oscilloscope-code-circuit]] - Arduino Based Real-Time Oscilloscope ([[oscilloscope-code]])   * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-oscilloscope-code-circuit]] - Arduino Based Real-Time Oscilloscope ([[oscilloscope-code]])
   * [[https://​circuitdigest.com/​microcontroller-projects/​raspberry-pi-based-oscilloscope]]   * [[https://​circuitdigest.com/​microcontroller-projects/​raspberry-pi-based-oscilloscope]]
 +  * [[https://​www.instructables.com/​id/​3-Channel-Arduino-Oscilloscope-Under-5-/​]] Arduino Oscilloscope Under 5 $ - 3 Channel
  
-==== Практические задания ====+===== Практические задания ​=====
 === Схемотехника === === Схемотехника ===
  
 +  * [[http://​circuits-cloud.com/​]] - circuits-cloud
   * [[http://​www.falstad.com/​circuit/​circuitjs.html]]- исследование и построение электрических схем (для создания своей схемы можно выбрать в меню "​Схемы -> Пустая схема"​)   * [[http://​www.falstad.com/​circuit/​circuitjs.html]]- исследование и построение электрических схем (для создания своей схемы можно выбрать в меню "​Схемы -> Пустая схема"​)
   * [[https://​github.com/​pfalstad/​circuitjs1]] - исходный код редактора электрических схем   * [[https://​github.com/​pfalstad/​circuitjs1]] - исходный код редактора электрических схем
Строка 42: Строка 48:
   * [[https://​www.tinkercad.com/​]] построить модель   * [[https://​www.tinkercad.com/​]] построить модель
   * [[https://​www.tinkercad.com/​dashboard?​type=circuits&​collection=designs]]   * [[https://​www.tinkercad.com/​dashboard?​type=circuits&​collection=designs]]
 +
 +=== Arduino Nano 3.0 распиновка ===
 +
 +  * [[http://​www.prorobot.ru/​arduino/​nano-v3.php]]
  
 ==== Двухканальный модуль управления двигателем HG7881 HG7881CP ==== ==== Двухканальный модуль управления двигателем HG7881 HG7881CP ====
Строка 52: Строка 62:
   * [[https://​github.com/​tangrs/​HG7881-Arduino]]   * [[https://​github.com/​tangrs/​HG7881-Arduino]]
  
-=== Программа для автоматического отключения двигателя в момент блокировки или перегрузки ===+**Простой код для управления реверсивным движением двигателей с равномерным ускорением и замедлением (двухканальный драйвер двигателя HG7881)** 
 + 
 +<code C++> 
 + 
 +/** 
 + * H-bridge module HG7881CP/​HG7881CP example code 
 +/** 
 + * Create variables to be used to run motor A 
 + */ 
 +int motorAPin_lA = 5; //Arduino digital 8 is connected to HG7881'​s A-1A terminal 
 +int motorAPin_lB = 9; //Arduino digital 9 is connected to HG7881'​s A-1B terminal 
 +int motorAPin_rA = 6; //Arduino digital 8 is connected to HG7881'​s A-1A terminal 
 +int motorAPin_rB = 10; 
 + 
 +void setup(){ 
 +  /** 
 +   * When program starts set Arduino pinmode for 8 and 9 digital to be OUTPUT 
 +   * so we can use analogWrite to output values from 0 to 255 (0-5V) (PWM)  
 +   */ 
 +  pinMode(motorAPin_lA,​ OUTPUT); //​direction 
 +  pinMode(motorAPin_lB,​ OUTPUT); //speed 
 +   ​pinMode(motorAPin_rA,​ OUTPUT); //​direction 
 +  pinMode(motorAPin_rB,​ OUTPUT); //speed 
 +  //​Serial.begin(9600);​ 
 +
 + 
 +void loop() { 
 +  //set motor direction to "​X"​ 
 +  digitalWrite(motorAPin_lA,​ LOW); 
 +  digitalWrite(motorAPin_rA,​ LOW);  
 +   
 +  //start motor and increase speed while spinnning to direction "​X"​ 
 +  for(int i=150; i<=255; i++){ 
 +    //motor speed increases while we loop trough  
 +    //values from 0 to 255 (0V to power supply max voltage) 
 +    analogWrite(motorAPin_lB,​ i); 
 +    analogWrite(motorAPin_rB,​ i); 
 +    delay(5); 
 +  } 
 +   //​wait 1 seconds while motor is running full speed 
 +  delay( 1000 );  
 +   
 +  for(int i=0; i<=105; i++){ 
 +    //motor speed increases while we loop trough  
 +    //values from 0 to 255 (0V to power supply max voltage) 
 +    analogWrite(motorAPin_lB,​ invertOurValue( i ) ); 
 +    analogWrite(motorAPin_rB,​ invertOurValue( i ) ); 
 +    delay(5); 
 +  } 
 +    
 + 
 +   
 +  //take 1 second pause, cutting power from motor ( speed pint to 0V ) 
 +  //so motor can stop (maybe your motor needs more time to spin down) 
 + 
 +  digitalWrite(motorAPin_lB,​ LOW); 
 +  digitalWrite(motorAPin_rB,​ LOW); 
 +  delay(1000);​ 
 +   
 +   
 +  //start motor and increase speed while spinnning to direction "​X"​ 
 +  for(int i=150; i<=255; i++){ 
 +    //motor speed increases while we loop trough  
 +    //values from 0 to 255 (0V to power supply max voltage) 
 +    analogWrite(motorAPin_lA,​ i); 
 +    analogWrite(motorAPin_rA,​ i); 
 +    delay(5); 
 +  } 
 +   //​wait 1 seconds while motor is running full speed 
 +  delay( 1000 );  
 +   
 +  for(int i=0; i<=105; i++){ 
 +    //motor speed increases while we loop trough  
 +    //values from 0 to 255 (0V to power supply max voltage) 
 +    analogWrite(motorAPin_lA,​ invertOurValue( i ) ); 
 +    analogWrite(motorAPin_rA,​ invertOurValue( i ) ); 
 +    delay(5); 
 +  } 
 +    
 + 
 +  //​Serial.println("​***"​);​ 
 + 
 +   
 +  //take 1 second pause, cutting power from motor ( speed pint to 0V ) 
 +  digitalWrite(motorAPin_lA,​ LOW); 
 +  digitalWrite(motorAPin_rA,​ LOW); 
 +  delay(1000);​ 
 +   
 +  //and now back to top 
 +
 + 
 + 
 +int invertOurValue(int input) { 
 +  return 255 - input; 
 +
 + 
 +</​code>​ 
 + 
 + 
 + 
 +==== Программа для автоматического отключения двигателя в момент блокировки или перегрузки ​====
 Кнопка позволяет запустить двигатель после того, как блокировка будет устранена. Кнопка позволяет запустить двигатель после того, как блокировка будет устранена.
 <code c++> <code c++>
Строка 96: Строка 206:
 } }
 </​code>​ </​code>​
 +
 +==== Управление двигателем постоянного тока посредством драйвера L293D ====
 +
  
 {{:​l293d_arduino.png|}} {{:​l293d_arduino.png|}}
Строка 160: Строка 273:
  
 </​code>​ </​code>​
 +
 +
 +Управление двумя моторами
 +
 +<code C++>
 +const int enablePinR = 3;  // (1)
 +const int in1PinR = 2;
 +const int in2PinR = 4;
 +const int enablePinL = 6;  // (1)
 +const int in1PinL = 7;
 +const int in2PinL = 8;
 + 
 +void setup() {                 // (2)
 +  pinMode(enablePinR,​ OUTPUT);
 +  pinMode(in1PinR,​ OUTPUT);
 +  pinMode(in2PinR,​ OUTPUT);
 +  pinMode(enablePinL,​ OUTPUT);
 +  pinMode(in1PinL,​ OUTPUT);
 +  pinMode(in2PinL,​ OUTPUT);
 +  Serial.begin(9600);​
 +  Serial.println("​Enter s (stop) or f or r followed by Duty Cycle (0 to 255). E.g. f120"​);​
 +}
 + 
 +void loop() {                         // (3)
 +  if (Serial.available()) {
 +    char direction = Serial.read(); ​  // (4)
 +    if (direction == '​s'​) {           // (5)
 +      stopR(); ​                        // (6)
 +      stopL();
 +      return;
 +    }
 +    int pwm = Serial.parseInt(); ​     // (7)
 +    if (direction == '​f'​) {           // (8)
 +      forwardR(pwm);​
 +      forwardL(pwm);​
 +    }
 +    else if (direction == '​r'​) {
 +      reverseR(pwm);​
 +      reverseL(pwm);​
 +    }
 +  }
 +}
 + 
 +void forwardR(int pwm)          // (9)
 +{
 +  digitalWrite(in1PinR,​ HIGH);
 +  digitalWrite(in2PinR,​ LOW);
 +  analogWrite(enablePinR,​ pwm);    ​
 +  Serial.print("​Forward ");
 +  Serial.println(pwm);​
 +}
 + 
 +void reverseR(int pwm)          // (10)
 +{
 +  digitalWrite(in1PinR,​ LOW);
 +  digitalWrite(in2PinR,​ HIGH);
 +  analogWrite(enablePinR,​ pwm);
 +  Serial.print("​Reverse ");
 +  Serial.println(pwm);​
 +}
 + 
 +void stopR() ​                   // (11)
 +{
 +  digitalWrite(in1PinR,​ LOW);
 +  digitalWrite(in2PinR,​ LOW);
 +  analogWrite(enablePinR,​ 0);
 +  Serial.println("​Stop"​);​
 +}
 +
 +void forwardL(int pwm)          // (9)
 +{
 +  digitalWrite(in1PinL,​ HIGH);
 +  digitalWrite(in2PinL,​ LOW);
 +  analogWrite(enablePinL,​ pwm);    ​
 +  Serial.print("​Forward ");
 +  Serial.println(pwm);​
 +}
 + 
 +void reverseL(int pwm)          // (10)
 +{
 +  digitalWrite(in1PinL,​ LOW);
 +  digitalWrite(in2PinL,​ HIGH);
 +  analogWrite(enablePinL,​ pwm);
 +  Serial.print("​Reverse ");
 +  Serial.println(pwm);​
 +}
 + 
 +void stopL() ​                   // (11)
 +{
 +  digitalWrite(in1PinL,​ LOW);
 +  digitalWrite(in2PinL,​ LOW);
 +  analogWrite(enablePinL,​ 0);
 +  Serial.println("​Stop"​);​
 +}
 +</​code>​
 +
 +==== Релейный регулятор датчика линии для мобильного робота (L293D) ====
 +
 +<code C++>
 +#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 = 170;
 +uint8_t lSState=0;
 +uint8_t rSState=0;
 + 
 + 
 +//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);​
 +
 +}
 + 
 +void loop() {
 +   ​lSState = digitalRead(lS);​
 +   ​rSState = digitalRead(rS);​
 +   ​Serial.println(lSState);​
 +   ​Serial.println(rSState);​
 +   ​Serial.println(""​); ​  
 + 
 + 
 +   if (lSState == 0 && rSState == 0){
 +    goForward(n_speed);​
 +   }
 + 
 +   if (lSState == 1 && rSState == 1){
 +    applyBrakes ();
 +   }
 +   if (lSState == 1 && rSState == 0){
 +    veerRight(n_speed,​ dif);
 +   }
 +   if (lSState == 0 && rSState == 1){
 +    veerLeft(n_speed,​ dif);
 +   ​} ​  
 + 
 +delay(1);
 + 
 +  }
 +
 + 
 +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>​
 +
 +
 +==== Релейный регулятор датчиков линии на драйвере 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>​
 +==== Управление питанием посредством кнопки ====
 +
 +
 +{{:​power_arduino.png|}}
 +
 +  * http://​arduino.ru/​forum/​apparatnye-voprosy/​vklyuchenie-pitaniya-odnoi-knopkoi
 +
 +{{:​power_arduino_2.png|}}
 +
 +  * https://​youtu.be/​lwY6NLT0krA ​
 +
 +==== Режимы энергосбережения (Sleep Modes) ====
 +  * [[http://​www.gaw.ru/​html.cgi/​txt/​doc/​micros/​avr/​arh/​mega103_28.htm]]
 +  * [[https://​sites.google.com/​site/​vanyambauseslinux/​arduino/​ispolzovanie-preryvanij-arduino/​probuzdenie-arduino-iz-spasego-rezima-po-nazatiu-knopki?​authuser=0]]
 +
 +=== Ключевые ресурсы ===
 +
 +
 +  * [[http://​robofob.ru/​materials/​articles/​pages/​Karpov_mobline1.pdf]] - Карпов В.Э., ПИД-управление в нестрогом изложении. (27 стр. "​Управление по энкодерам"​)
 +  * [[https://​www.hse.ru/​data/​2013/​06/​17/​1287016759/​%D0%94%D0%B8%D0%BF%D0%BB%D0%BE%D0%BC.doc]] Луцкий В.А. «Исследование адаптивных алгоритмов передвижения шестиногого шагающего робота»,​ Дипломная работа.
 +  * 
  
 ==== Характеристика двигателя постоянного тока Makeblock 81340 180 Optical Encoder Motor ==== ==== Характеристика двигателя постоянного тока Makeblock 81340 180 Optical Encoder Motor ====
Строка 166: Строка 747:
   * [[https://​media.digikey.com/​pdf/​Data%20Sheets/​Makeblock%20PDFs/​81340_Web.pdf]]   * [[https://​media.digikey.com/​pdf/​Data%20Sheets/​Makeblock%20PDFs/​81340_Web.pdf]]
   * [[https://​store.makeblock.com/​180-optical-encoder-motor]]   * [[https://​store.makeblock.com/​180-optical-encoder-motor]]
 +
   * [[https://​roboshop.spb.ru/​TB6612FNG-module]] - оптимальный для данного мотора драйвер   * [[https://​roboshop.spb.ru/​TB6612FNG-module]] - оптимальный для данного мотора драйвер
   * [[https://​www.sparkfun.com/​datasheets/​Robotics/​TB6612FNG.pdf]]   * [[https://​www.sparkfun.com/​datasheets/​Robotics/​TB6612FNG.pdf]]
   * [[http://​arduinolab.pw/​index.php/​2017/​07/​04/​dvuxkanalnyj-drajver-kollektornyx-motorov-tb6612fng/​]]   * [[http://​arduinolab.pw/​index.php/​2017/​07/​04/​dvuxkanalnyj-drajver-kollektornyx-motorov-tb6612fng/​]]
-  * +  * [[https://​github.com/​Makeblock-official/​Makeblock_Electronic_Modules_v2.0_Schematic_File]] - принципиальные электронные схемы 
 +  * [[http://​download.makeblock.com/​Me%20Auriga%20%E7%94%B5%E8%B7%AF%E5%9B%BEV1.1%20-%2020160221.pdf]] 
 +  * [[https://​www.instructables.com/​id/​Advanced-Makeblock-Sensors-DIY/​]] 
 + 
 +===== Программирование мобильного робота ===== 
 + 
 +**Шасси ​ Makeblock, двигатель "​Makeblock 81340 180 Optical Encoder Motor",​ драйвер TB6612FNG.** 
 + 
 + 
 + 
 +  * [[http://​digitrode.ru/​articles/​123-robot-na-osnove-arduino-chast-iii-podklyuchenie-programmirovanie-i-probnyy-pusk.html]] вариант программы для мобильного робота с использованием драйвера TB6612FNG 
 + 
 +<code C++> 
 +// http://​arduinolab.pw/​index.php/​2017/​07/​04/​dvuxkanalnyj-drajver-kollektornyx-motorov-tb6612fng/​ 
 +// http://​digitrode.ru/​articles/​123-robot-na-osnove-arduino-chast-iii-podklyuchenie-programmirovanie-i-probnyy-pusk.html 
 + 
 +#define PWMA 11  // выходы 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);​ 
 +  
 +
 +  
 +void loop() { 
 +    
 +  startUp();​ 
 +  goForward();​ 
 +  delay(5500);​ 
 +  turnAround();​ 
 +  goForward();​ 
 +  delay(5500);​ 
 +  turnAround();​ 
 +  goBackward();​ 
 +  delay(5500);​ 
 +  rotateLeft();​ 
 +  delay(560);​ 
 +  rotateRight();​ 
 +  delay(560);​ 
 +  goForward();​ 
 +  delay(3000);​ 
 +  applyBrakes();​ 
 +  delay(2000);​ 
 +  } 
 +  
 +/* Определение функций */ 
 +/* Опытным путем было выяснено,​ что при коэффициенте ШИМ равном 233 */ 
 +/* для левого двигателя и 255 для правого позволяют роботу */ 
 +/* двигаться по прямой на полной скорости. Тесты показали,​ что робот */ 
 +/* совершает 27 оборотов вокруг своей оси в минуту при вращении двигателей */ 
 +/* в противоположные стороны при полном заполнении ШИМ. Эта величина ​ */ 
 +/* была использована для определения времени,​ */ 
 +/* за которое робот повернется на 90, 180 и 360 градусов. */ 
 +  
 +void goForward () 
 +
 +  digitalWrite (AIN1,​HIGH);​ 
 +  digitalWrite (AIN2,​LOW);​ 
 +  analogWrite(PWMA,​234);​ 
 +  digitalWrite (BIN1,​HIGH);​ 
 +  digitalWrite (BIN2,​LOW);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void goBackward () 
 +
 +  digitalWrite (AIN1,​LOW);​ 
 +  digitalWrite (AIN2,​HIGH);​ 
 +  analogWrite(PWMA,​233);​ 
 +  digitalWrite (BIN1,​LOW);​ 
 +  digitalWrite (BIN2,​HIGH);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void rotateRight () 
 +
 +  digitalWrite (AIN1,​HIGH);​ 
 +  digitalWrite (AIN2,​LOW);​ 
 +  analogWrite(PWMA,​255);​ 
 +  digitalWrite (BIN1,​LOW);​ 
 +  digitalWrite (BIN2,​HIGH);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void rotateLeft () 
 +
 +  digitalWrite (AIN1,​LOW);​ 
 +  digitalWrite (AIN2,​HIGH);​ 
 +  analogWrite(PWMA,​255);​ 
 +  digitalWrite (BIN1,​HIGH);​ 
 +  digitalWrite (BIN2,​LOW);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void veerLeft () 
 +
 +  digitalWrite (AIN1,​HIGH);​ 
 +  digitalWrite (AIN2,​LOW);​ 
 +  analogWrite(PWMA,​190);​ 
 +  digitalWrite (BIN1,​HIGH);​ 
 +  digitalWrite (BIN2,​LOW);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void veerRight () 
 +
 +  digitalWrite (AIN1,​HIGH);​ 
 +  digitalWrite (AIN2,​LOW);​ 
 +  analogWrite(PWMA,​255);​ 
 +  digitalWrite (BIN1,​HIGH);​ 
 +  digitalWrite (BIN2,​LOW);​ 
 +  analogWrite(PWMB,​190);​  
 +
 +  
 +void applyBrakes () 
 +
 +  digitalWrite (AIN1,​HIGH);​ 
 +  digitalWrite (AIN2,​HIGH);​ 
 +  analogWrite(PWMA,​255);​ 
 +  digitalWrite (BIN1,​HIGH);​ 
 +  digitalWrite (BIN2,​HIGH);​ 
 +  analogWrite(PWMB,​255);​  
 +
 +  
 +void startUp () 
 +
 +  digitalWrite(STBY,​HIGH);​ 
 +
 +  
 +void turnAround() 
 +
 +  rotateLeft();​ 
 +  delay(1370);​ 
 +
 +  
 +void shutDown () 
 +
 +  digitalWrite(STBY,​LOW);​ 
 +
 + 
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==== Вариант 1.1. Простейший релейный регулятор движения по линии ==== 
 +<code C++> 
 + 
 +  
 +#define PWMA 11  // выходы arduino 
 +#define PWMB 10 
 +#define AIN1 6 
 +#define AIN2 7 
 +#define BIN1 5 
 +#define BIN2 4 
 +#define STBY 13  
 + 
 +#define lS 9 
 +#define rS 8  
 + 
 +int min_speed = 120; 
 +int max_speed = 255; 
 +int n_speed = 180; 
 +int dif = 170; 
 +uint8_t lSState=0;​ 
 +uint8_t rSState=0;​ 
 + 
 + 
 +//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(STBY,​OUTPUT);​ 
 +pinMode(lS,​INPUT);​ 
 +pinMode(rS,​INPUT);​ 
 +Serial.begin(9600);​ 
 +startUp();​ 
 +
 +  
 +void loop() { 
 +   ​lSState = digitalRead(lS);​ 
 +   ​rSState = digitalRead(rS);​ 
 +   ​Serial.println(lSState);​ 
 +   ​Serial.println(rSState);​ 
 +   ​Serial.println(""​); ​   
 +  
 +  
 +   if (lSState == 0 && rSState == 0){ 
 +    goForward(n_speed);​ 
 +   } 
 +  
 +   if (lSState == 1 && rSState == 1){ 
 +    applyBrakes (); 
 +   } 
 +   if (lSState == 1 && rSState == 0){ 
 +    veerRight(n_speed,​ dif); 
 +   } 
 +   if (lSState == 0 && rSState == 1){ 
 +    veerLeft(n_speed,​ dif); 
 +   ​} ​   
 +  
 +delay(1); 
 +  
 +  } 
 + 
 +  
 +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);​  
 +
 +  
 +void startUp () 
 +
 +  digitalWrite(STBY,​HIGH);​ 
 +
 +  
 + 
 +  
 +void shutDown () 
 +
 +  digitalWrite(STBY,​LOW);​ 
 +
 + 
 +</​code>​ 
 + 
 +==== Реализация машины состояний при движении по линии ==== 
 + 
 + 
 +<code C++> 
 +  
 +#define PWMA 11  // выходы arduino 
 +#define PWMB 10 
 +#define AIN1 6 
 +#define AIN2 7 
 +#define BIN1 5 
 +#define BIN2 4 
 +#define STBY 13  
 +  
 +#define lS 9 
 +#define rS 8  
 +  
 +int min_speed = 120; 
 +int max_speed = 255; 
 +int n_speed = 200; 
 +int dif = 200; 
 + 
 +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);​ 
 + ​startUp();​ 
 +
 + 
 +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); 
 +        veerRight(sp,​ d); 
 +      else if (prevState == 10) 
 +        //​veerRight(sp,​ d); 
 +        veerLeft(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);​  
 +
 +  
 +void startUp () 
 +
 +  digitalWrite(STBY,​HIGH);​ 
 +
 +  
 + 
 +  
 +void shutDown () 
 +
 +  digitalWrite(STBY,​LOW);​ 
 +
 + 
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==== Вариант 2.1. Простейший релейный регулятор движения по линии + ультразвуковой датчик препятствия (промежуточный вариант,​ требует доработки) ==== 
 + 
 + 
 +<code C++> 
 + 
 +  
 +#include <​Ping.h>​ 
 + 
 + 
 +#define PWMA 11  // выходы arduino 
 +#define PWMB 10 
 +#define AIN1 6 
 +#define AIN2 7 
 +#define BIN1 5 
 +#define BIN2 4 
 +#define STBY 13  
 +  
 +#define lS 9 
 +#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 = 120; 
 +int max_speed = 255; 
 +int n_speed = 220; 
 +int dif = 220; 
 +  
 +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);​ 
 + ​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(){ 
 +  ping.fire();​ 
 +  //​Serial.println("​***"​);​  
 +
 +  
 +void loop() { 
 +  // time ===================== 
 +  uint32_t currentMillis = millis(); 
 +  if (currentMillis - previousMillis >= timePeriod){ 
 +    //​Serial.println(millis());​ 
 +    //​Serial.println(ping.centimeters());​ 
 +    ping_distance = ping.centimeters();​ 
 +    ping_fire();​ 
 +    previousMillis = currentMillis;​ 
 +  } 
 +  //​======================= 
 +  testSensors();​ 
 +  if (ping_distance > distance){ 
 +    updateMotion(n_speed,​ dif); 
 +  } else { 
 +    applyBrakes (); 
 +  } 
 +  
 + // centralLineFollower();​ 
 +  
 +  //​delay(1);​ 
 +  
 +  } 
 +  
 +void updateMotion(int sp, int d){ 
 +    switch ( state ) { 
 +    case 0: 
 +      if (prevState == 1) 
 +        //​veerLeft(sp,​ d); 
 +        veerRight(sp,​ d); 
 +      else if (prevState == 10) 
 +        //​veerRight(sp,​ d); 
 +        veerLeft(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);​  
 +
 +  
 +void startUp () 
 +
 +  digitalWrite(STBY,​HIGH);​ 
 +
 +  
 +  
 +  
 +void shutDown () 
 +
 +  digitalWrite(STBY,​LOW);​ 
 +
 + 
 +/* 
 +В библиотеке Ping.cpp  
 +вместо строки 
 +  _duration = pulseIn(_pin,​ HIGH); 
 +следует использовать 
 +  _duration = pulseIn(_pin,​ HIGH, 40000); 
 +*/ 
 + 
 +</​code>​ 
 + 
 +==== Вариант 2.2. Простейший релейный регулятор движения по линии + ультразвуковой датчик препятствия (боле-менее работает :-) ==== 
 + 
 + 
 +<code C++> 
 +#include <​Ping.h>​ 
 + 
 +/* 
 + 
 +*/ 
 +#define PWMA 11  // выходы arduino 
 +#define PWMB 10  
 +#define AIN1 6 
 +#define AIN2 7 
 +#define BIN1 5 
 +#define BIN2 4 
 +#define STBY 13  
 +  
 +#define lS 9 
 +#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 = 120; 
 +int max_speed = 255; 
 +int n_speed = 200; 
 +int dif = 200; 
 +  
 +uint8_t lSState; 
 +uint8_t rSState; 
 +  
 +int state; 
 +int prevState;​ 
 +int readyState = 0; 
 + 
 +int is_obstacle = 0; 
 + 
 +void updateState(int st){ 
 +  state = st; 
 +
 +  
 +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);​ 
 + ​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);​ 
 +          updateState(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); ​       
 +       ​updateState(11);​ 
 +        
 +       //​veerRight(n_speed,​ dif); 
 +   } 
 +   if (lSState == 0 && rSState == 1   ){ 
 +       ​resetState(1);​ 
 +       //​veerLeft(n_speed,​ dif); 
 +   ​} ​  
 +  
 +
 +  
 +void ping_fire(){ 
 +  ping.fire();​ 
 +  //​Serial.println("​***"​);​  
 +
 +  
 +void loop() { 
 +  // time ===================== 
 +  uint32_t currentMillis = millis(); 
 +  if (currentMillis - previousMillis >= timePeriod){ 
 +    //​Serial.println(millis());​ 
 +    //​Serial.println(ping.centimeters());​ 
 +    if (ping_distance > distance){ 
 +      is_obstacle = 0; 
 +    } else { 
 +      is_obstacle = 1; 
 +    } 
 +    ping_distance = ping.centimeters();​ 
 +    ping_fire();​ 
 +    previousMillis = currentMillis;​ 
 +  } 
 +  //​======================= 
 +   
 +  if (is_obstacle != 1){ 
 +    testSensors();​ 
 +    updateMotion(n_speed,​ dif); 
 +  } else { 
 +    applyBrakes (); 
 +  } 
 +  
 + // centralLineFollower();​ 
 +  
 +  //​delay(1);​ 
 +  
 +  } 
 +  
 +void updateMotion(int sp, int d){ 
 +    switch ( state ) { 
 +    case 0: 
 +      if (prevState == 1) 
 +        //​veerLeft(sp,​ d); 
 +        veerRight(sp,​ d); 
 +      else if (prevState == 10) 
 +        //​veerRight(sp,​ d); 
 +        veerLeft(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);​  
 +
 +  
 +void startUp () 
 +
 +  digitalWrite(STBY,​HIGH);​ 
 +
 +  
 +  
 +  
 +void shutDown () 
 +
 +  digitalWrite(STBY,​LOW);​ 
 +
 + 
 + 
 +/* 
 +В библиотеке Ping.cpp  
 +вместо строки 
 +  _duration = pulseIn(_pin,​ HIGH); 
 +следует использовать 
 +  _duration = pulseIn(_pin,​ HIGH, 40000); 
 +*/ 
 +</​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://​embeddedlab.csuohio.edu/​RoboticSwarms/​ultrasonic_sensors.html]] 
 +  * [[http://​arduino.ru/​forum/​programmirovanie/​nestabilnaya-rabota-uz-datchika]] - Форум: "​Нестабильная работа УЗ датчика"​ 
 + 
 +==== Bluetooth модуль HC-06 ==== 
 + 
 +  * [[https://​lesson.iarduino.ru/​page/​bluetooth-modul-hc-06-podklyuchenie-k-arduino-upravlenie-ustroystvami-s-telefona]] 
 +  * [[https://​arduinomaster.ru/​datchiki-arduino/​arduino-bluetooth-hc05-hc06/​]] 
 +  * [[http://​zelectro.cc/​HC-06_bluetooth_module]] 
 +  * [[http://​psenyukov.ru/​%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-bluetooth-hc-06-%D0%BA-arduino-%D1%81-%D0%BF%D1%80%D0%BE%D1%88%D0%B8%D0%B2%D0%BA%D0%BE%D0%B9-grbl/​]] 
 +==== Указатели в C для Ардуино ==== 
 + 
 +  * [[http://​mypractic.ru/​urok-15-ukazateli-v-c-dlya-arduino-preobrazovanie-raznyx-tipov-dannyx-v-bajty.html]] 
 + 
 + 
 +==== Принципы программирования оптических энкодеров ==== 
 +  * [[http://​robotosha.ru/​arduino/​wheel-encoders-dfrobot.html]] ... колесные энкодеры ... (измерение скорости) 
 +  * [[https://​sohabr.net/​habr/​post/​340448/?​version=254649]] - как определить угол поворота инкрементального энкодера 
 +  * [[http://​robofob.ru/​materials/​begin/​mEncoder.pdf]] Карпов В.Э. Управление движением робота с использованием энкодеров 
 +  * [[https://​www.arduino.cc/​reference/​en/​language/​functions/​external-interrupts/​attachinterrupt/​]] attachInterrupt() 
 +  * https://​playground.arduino.cc/​Main/​RotaryEncoders  
 +  * https://​forum.arduino.cc/​index.php?​topic=488275.0  
 +  * https://​www.allaboutcircuits.com/​projects/​how-to-use-a-rotary-encoder-in-a-mcu-based-project/​  
 +  * http://​www.bristolwatch.com/​arduino/​arduino2.htm  
 +  * http://​makeatronics.blogspot.com/​2013/​02/​efficiently-reading-quadrature-with.html  
 +  * http://​mypractic.ru/​urok-55-rabota-s-inkrementalnym-enkoderom-v-arduino-biblioteka-encod_er-h.html  
 +  * http://​cxem.net/​arduino/​arduino8.php  
 +  * https://​www.instructables.com/​id/​Improved-Arduino-Rotary-Encoder-Reading/​  
 +  * https://​robu.in/​run-rotary-encoder-arduino-code/​ 
 +  * https://​arduino.stackexchange.com/​questions/​598/​how-precise-can-i-get-arduino-using-rotary-encoders 
 +  * http://​robotosha.ru/​robotics/​optical-encoders.html 
 +  * http://​robocraft.ru/​blog/​2965.html 
 +  * http://​robot-kit.ru/​product_info.php/​info/​p811_Modul-datchika-oborotov--yenkoder--RKP-MWES-LM393-.html 
 +  * [[http://​robot-kit.ru/​manual/​Motor_Wheel_Encoder_Sensor.pdf]] Карпов В.Э. Управление движением роботов с использованием энкодеров 
 +  * http://​easyelectronics.ru/​avr-uchebnyj-kurs-inkrementalnyj-enkoder.html 
 +  * [[http://​robofob.ru/​materials/​articles/​pages/​avprog.pdf]] Карпов В.Э. Автоматное программирование и робототехника 
 + 
 +==== Прерывания по таймеру ==== 
 + 
 +  * [[https://​playground.arduino.cc/​Code/​Timer1/​]] :: Timer1 :: !!! 
 +  * [[https://​code.google.com/​archive/​p/​arduino-timerone/​downloads]] 
 +  * [[https://​github.com/​PaulStoffregen/​TimerOne]] 
 +  * [[https://​wm-help.net/​lib/​b/​book/​1248084587/​6]] 
 +  * [[https://​habr.com/​ru/​post/​337430/​]] !!!  
 +  * [[http://​arduino.ru/​forum/​programmirovanie/​preryvaniya-po-taimeru]] ​  
 +  * [[https://​all-arduino.ru/​arduino-dlya-nachinayushhih-urok-14-preryvaniya/​]] 
 +  * [[http://​robotosha.ru/​arduino/​multitasking-and-interrupts-arduino.html]] 
 + 
 +==== О прерываниях ==== 
 + 
 +  * https://​radioprog.ru/​post/​499 
 +  * https://​all-arduino.ru/​programmirovanie-arduino/​attachinterrupt/​ 
 +  * https://​m.habr.com/​ru/​post/​253213/​ 
 +  * https://​arduinomaster.ru/​program/​preryvaniya-arduino-attachinterrupt/​ 
 +  * http://​robotosha.ru/​arduino/​arduino-interrupts.html 
 + 
 +==== Дополнительные материалы по управлению двигателями... ==== 
 +  * [[https://​sohabr.net/​habr/​post/​280486/#​comment_8837922]] 
 +  * https://​sohabr.net/​habr/​post/​277671/​  
 +  * https://​habr.com/​ru/​post/​260783/​ 
 +  * https://​sohabr.net/​habr/​post/​340448/?​version=254649 
 +  *   
  
  
Строка 1555: Строка 3312:
  
   * [[http://​dpo.temocenter.ru/​dlya-pedagogov/​course/​54.html]]   * [[http://​dpo.temocenter.ru/​dlya-pedagogov/​course/​54.html]]
 +
 +
 +https://​ru.hexlet.io/​courses/​cli-basics/​lessons/​users-and-groups/​theory_unit
 +https://​ru.hexlet.io/​courses/​cli-basics/​lessons/​sudo/​theory_unit ​
 +
kiber_tc_2018.txt · Последние изменения: 2019/11/20 23:06 — super_admin