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

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


kiber_tc_2018

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
kiber_tc_2018 [2019/01/04 17:45]
super_admin [AlphaBot]
kiber_tc_2018 [2019/11/20 23:06] (текущий)
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 =====
     
 +  * [[https://​circuitdigest.com/​calculators/​resistor-color-code-calculator]] - Resistor Color Code Calculator
   * [[https://​circuitdigest.com/​calculators/​voltage-divider-calculator]] ​ - Voltage Divider Calculator   * [[https://​circuitdigest.com/​calculators/​voltage-divider-calculator]] ​ - Voltage Divider Calculator
-  * [[https://circuitdigest.com/​calculators/​ohms-law-calculator]] - Ohm's Law Calculator +  * [[https://​circuitdigest.com/​calculators/​ohms-law-calculator]] - Ohm's Law Calculator 
-  * [[https://circuitdigest.com/​microcontroller-projects/​arduino-wattmeter-to-measure-voltage-current-power-consumption]] - Arduino Wattmeter: Measure Voltage, Current and Power Consumption +  * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-wattmeter-to-measure-voltage-current-power-consumption]] - Arduino Wattmeter: Measure Voltage, Current and Power Consumption 
-  * [[https://circuitdigest.com/​microcontroller-projects/​arduino-sound-level-measurement]] - Measure Sound/Noise Level in dB with Microphone and Arduino+  * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-sound-level-measurement]] - Measure Sound/Noise Level in dB with Microphone and Arduino
   * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-lc-meter-measure-inductance]] - LC Meter using Arduino: Measuring Inductance and Frequency   * [[https://​circuitdigest.com/​microcontroller-projects/​arduino-lc-meter-measure-inductance]] - LC Meter using Arduino: Measuring Inductance and Frequency
   * [[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://tinyurl.com/y8sahd4v ​построить схему +  * [[http://circuits-cloud.com/]] - circuits-cloud 
-  * [[https://online-electric.ru/circuitjs/​circuitjs.html?​cct=$+1+0.000005+11.086722712598126+63+10+62%0A]] +  * [[http://​www.falstad.com/​circuit/​circuitjs.html]]- исследование и построение электрических ​схем ​(для создания своей схемы можно выбрать в меню "​Схемы -> Пустая схема"​) 
-  * https://www.tinkercad.comпостроить модель +  * [[https://github.com/​pfalstad/​circuitjs1]] ​исходный код редактора электрических схем 
-  * [[https://www.tinkercad.com/things/knQYO4ozC7n-tremendous-jaagub/editel?sharecode=1hxe64VG_I8Tud7HUdmPze0zgMWB5r1nSayFDbCRkxs=]] простая схема со светодиодом +  * [[http://​www.falstad.com/circuit/​circuitjs.html?​cct=$+1+0.000005+10.20027730826997+50+5+50%0Ar+496+240+496+320+0+1000%0Ar+496+320+496+432+0+1000%0Aw+496+240+560+240+0%0At+560+432+624+432+0+1+-4.999812386653795+1.0499981238248927e-10+100%0At+560+240+592+240+0+-1+-0.6320548043420962+-0.6760473009654655+100%0Aw+496+432+560+432+0%0Aw+624+416+624+384+0%0Aw+592+256+592+288+0%0Aw+592+224+672+224+0%0Aw+624+448+624+480+0%0Aw+624+480+704+480+0%0Ag+704+480+704+512+0%0Aw+624+384+704+384+0%0Ar+704+384+800+384+0+220%0A162+880+384+800+384+2+default-led+1+0+0+0.01%0Ar+592+288+672+288+0+220%0A162+672+288+768+288+2+default-led+1+0+0+0.01%0AR+672+224+736+224+0+0+40+5+0+0+0.5%0AR+880+384+944+384+0+0+40+5+0+0+0.5%0Ag+768+288+768+320+0%0Ag+240+336+240+400+0%0Aw+400+320+496+320+0%0AS+400+320+336+320+0+0+false+0+2%0Aw+336+336+240+336+0%0AR+336+304+272+304+0+0+40+5+0+0+0.5%0A | Логический пробник]] 
-  * [[https://www.tinkercad.com/things/jZ7ivD7RkUH-brilliant-robo-kasi/editel?​sharecode=PTLifJt6horgjiZCVDpmcxsi7_5seGtIt0TWB23HJ8Y=]] ​подключение приборов  +  * [[http://forum.amperka.ru/threads/​%D0%9F%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%81-h-%D0%BC%D0%BE%D1%81%D1%82%D0%BE%D0%BC.4974/​]] - собрать схему Н - моста на транзисторах 
-  * [[https://​www.tinkercad.com/​things/da3l6uu8BiL-introduction-to-arduino/editel?sharecode=DTMnm3uq0WT3l1Ntfv5nXU8BBQXjUlj4amxXW79n_O4=]]  - Arduino+  * [[https://ru.wikipedia.org/wiki/H-%D0%BC%D0%BE%D1%81%D1%82]]  ​Н - мост 
 +  * [[http://​www.falstad.com/​circuit/​circuitjs.html?cct=$+1+0.000005+10.20027730826997+50+5+50%0At+448+224+528+224+0+-1+4.973606068151249+-1.049738074243578e-10+100%0At+896+224+800+224+0+-1+-0.6328270118075503+-0.659220943551361+100%0At+448+368+528+368+0+1+0.6328270118075549+0.6592209435513317+100%0At+896+368+800+368+0+1+-4.9736060681512155+1.0497360606398775e-10+100%0Aw+528+240+528+272+0%0Aw+528+352+528+320+0%0Aw+528+320+528+272+0%0Aw+800+240+800+272+0%0Aw+800+352+800+320+0%0Aw+528+272+560+272+0%0Aw+528+320+560+320+0%0Aw+800+272+768+272+0%0Aw+800+320+768+320+0%0Ar+560+272+640+272+0+1000%0A162+768+272+640+272+2+default-led+1+0+0+0.01%0A162+640+320+768+320+2+default-led+1+0+0+0.01%0Ar+560+320+640+320+0+1000%0Aw+800+272+800+320+0%0Aw+528+208+528+176+0%0Aw+528+176+656+176+0%0Aw+656+176+800+176+0%0Aw+800+176+800+208+0%0Aw+656+176+656+128+0%0AR+656+128+656+64+0+0+40+5+0+0+0.5%0Aw+528+384+528+416+0%0Aw+528+416+656+416+0%0Aw+656+416+800+416+0%0Aw+800+416+800+384+0%0Aw+656+416+656+448+0%0Ag+656+448+656+480+0%0Ar+896+224+976+224+0+1000%0Ar+896+368+976+368+0+1000%0Ar+448+224+368+224+0+1000%0Ar+448+368+368+368+0+1000%0Aw+368+224+368+288+0%0Aw+368+288+368+368+0%0Aw+976+224+976+288+0%0Aw+976+368+976+288+0%0Aw+368+288+304+288+0%0Aw+976+288+1040+288+0%0Ax+251+237+264+240+4+24+9%0AR+224+272+144+272+0+0+40+5+0+0+0.5%0Ag+1152+304+1248+304+0%0Ax+1077+250+1103+253+4+24+10%0AS+1040+288+1152+288+0+1+false+0+2%0AS+304+288+224+288+0+1+false+0+2%0AR+1152+272+1216+272+0+0+40+5+0+0+0.5%0Ag+224+304+224+352+0%0Ad+768+272+768+176+2+default%0Ad+768+416+768+320+2+default%0Ad+560+416+560+320+2+default%0Ad+560+272+560+176+2+default%0A | Н-мостмодель]] 
 +  * [[http://​arduinoforme.blogspot.com/​2016/​02/​h-bridge.html]] - теория и практика подключения Н-моста к Arduino 
 +  * [[http://forum.cxem.net/index.php?/topic/​104625-%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D1%82%D0%BE%D0%BA%D0%B0/&tab=comments#​comment-1172699 | обсуждение ​вариантов управления двигателем на форуме]] 
 +  * [[https://​online-electric.ru/​circuitjs/​circuitjs.html?​cct=$+1+0.000005+11.086722712598126+63+10+62%0A]] - Пустой лист для схемы 
 +  * [[https://​www.tinkercad.com/​]] построить модель 
 +  * [[https://www.tinkercad.com/​dashboard?type=circuits&​collection=designs]]
  
-=== Передача данных по последовательному порту ​=== +=== Arduino Nano 3.0 распиновка ===
-  * [[http://​arduino.proger.site/​basic/​serial]]+
  
-=== АЦП ===+  * [[http://​www.prorobot.ru/​arduino/​nano-v3.php]] 
 + 
 +==== Двухканальный модуль управления двигателем HG7881 HG7881CP ==== 
 +  * [[https://​amperkot.ru/​msk/​catalog/​dvuhkanalnyiy_modul_upravleniya_dvigatelem_hg7881_hg7881cp-23934276.html]] 
 +  * [[https://​ru.aliexpress.com/​item/​10pcs-lot-L9110S-DC-Stepper-Motor-Driver-Board-H-Bridge-L9110-for-arduino-Free-Shipping-Dropshipping/​32251090078.html?​af=10546&​aff_platform=default&​cpt=1548686935579&​afref=http%253A%252F%252Farduinolab.pw%252Findex.php%252F2017%252F06%252F15%252Fdrajver-kollektornyx-dvigatelej-l9110s-hg7881&​cn=42pm1qhjvbsa4t2flcv6r7h14pfg4m4m&​dp=v5_42pm1qhjvbsa4t2flcv6r7h14pfg4m4m&​itemrewrite=32251090078_32251090078&​duration=1.677545&​cv=13433332&​pvid=191fc30a-2747-4118-bab0-e8c278da89f4&​sk=ccfBY4yg&​aff_trace_key=75bd404405ae41d38f5b523b6b137924-1548686935579-03022-ccfBY4yg&​from=ITEM_DETAIL&​to=ITEM_DETAIL&​scm=1007.22893.125778.0&​olstatus=noneresult&​terminal_id=fb89ac74bab94e698339cc42f357df45 | aliexpress]] 
 +  * [[https://​habr.com/​ru/​post/​211999/​]] 
 +  * [[http://​arduino-project.net/​drajver-dvigatelya-hg7881-arduino/​]] 
 +  * [[http://​arduino-project.net/​drajver-dvigatelya-hg7881-arduino/​]] Двухканальный драйвер двигателя HG7881 и ардуино (управление скоростью вращения двигателем). 
 +  * [[http://​diyprojects.eu/​how-to-use-h-bridge-hg7881-with-external-power-supply-and-arduino/​]] - How to use H-bridge HG7881 (HG7881CP) module with external power supply and Arduino UNO 
 +  * [[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++> 
 + 
 +int analogPin = A1;     // аналоговый порт А1 
 +int state = 1;  
 +int newState =  state; 
 +int pin9 = 9; 
 +int val = 0; 
 +int button = 0; 
 +int buttonPin = 4; 
 +  
 +void setup() { 
 +  // put your setup code here, to run once: 
 +  Serial.begin(9600);​ 
 +  pinMode(pin9,​ OUTPUT); 
 +  digitalWrite(pin9,​ state); 
 +  pinMode(buttonPin,​ INPUT);  
 +
 +  
 +void loop() {   
 +    
 +  val = analogRead(analogPin);​ 
 +  //val = map(val, 100, 700, 0, 1000); 
 +  Serial.println(val); ​    
 +  if (val > 500) { 
 +    newState = 0; 
 +      
 +  } 
 +  if (newState != state) { 
 +    Serial.println("​***"​); ​  
 +    digitalWrite(pin9,​newState);​ 
 +     state = newState; 
 +  } 
 +    button = digitalRead(buttonPin);​ 
 +  if (button == HIGH) { 
 +    newState = 1; 
 +    
 +  } 
 + 
 + 
 +  delay(100);​ 
 +
 +</​code>​ 
 + 
 +==== Управление двигателем постоянного тока посредством драйвера L293D ==== 
 + 
 + 
 +{{:​l293d_arduino.png|}} 
 + 
 + 
 + 
 +  * [[https://​github.com/​simonmonk/​make_action/​blob/​master/​arduino/​experiments/​full_motor_control/​full_motor_control.ino]] 
 +  *  
 +<code c++> 
 +const int enablePin = 11;  // (1) 
 +const int in1Pin = 10; 
 +const int in2Pin = 9; 
 + 
 +void setup() {                 // (2) 
 +  pinMode(enablePin,​ OUTPUT); 
 +  pinMode(in1Pin,​ OUTPUT); 
 +  pinMode(in2Pin,​ 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) 
 +      stop(); ​                        // (6) 
 +      return; 
 +    } 
 +    int pwm = Serial.parseInt(); ​     // (7) 
 +    if (direction == '​f'​) {           // (8) 
 +      forward(pwm);​ 
 +    } 
 +    else if (direction == '​r'​) { 
 +      reverse(pwm);​ 
 +    } 
 +  } 
 +
 + 
 +void forward(int pwm)          // (9) 
 +
 +  digitalWrite(in1Pin,​ HIGH); 
 +  digitalWrite(in2Pin,​ LOW); 
 +  analogWrite(enablePin,​ pwm);     
 +  Serial.print("​Forward "); 
 +  Serial.println(pwm);​ 
 +
 + 
 +void reverse(int pwm)          // (10) 
 +
 +  digitalWrite(in1Pin,​ LOW); 
 +  digitalWrite(in2Pin,​ HIGH); 
 +  analogWrite(enablePin,​ pwm); 
 +  Serial.print("​Reverse "); 
 +  Serial.println(pwm);​ 
 +
 + 
 +void stop() ​                   // (11) 
 +
 +  digitalWrite(in1Pin,​ LOW); 
 +  digitalWrite(in2Pin,​ LOW); 
 +  analogWrite(enablePin,​ 0); 
 +  Serial.println("​Stop"​);​ 
 +
 + 
 +</​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 ==== 
 + 
 +  * [[https://​www.mightyape.co.nz/​product/​makeblock-81340-180-optical-encoder-motor/​26855245]] 
 +  * [[https://​media.digikey.com/​pdf/​Data%20Sheets/​Makeblock%20PDFs/​81340_Web.pdf]] 
 +  * [[https://​store.makeblock.com/​180-optical-encoder-motor]] 
 + 
 +  * [[https://​roboshop.spb.ru/​TB6612FNG-module]] - оптимальный для данного мотора драйвер 
 +  * [[https://​www.sparkfun.com/​datasheets/​Robotics/​TB6612FNG.pdf]] 
 +  * [[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>​ 
 + 
 +==== Реализация машины состояний при движении по линии (Nano ATmega328P Old) ==== 
 + 
 +<code C++> 
 + 
 +#define PWMA 9  // выходы arduino 
 +#define PWMB 10 
 +#define AIN1 6 
 +#define AIN2 7 
 +#define BIN1 5 
 +#define BIN2 4 
 +#define STBY 13  
 +  
 +#define lS 2 
 +#define rS 3 
 +  
 +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/​]] 
 +  * [[https://​play.google.com/​store/​apps/​details?​id=braulio.calle.bluetoothRCcontroller&​hl=ru]] - Google Play bluetooth-rc-car 
 +  * [[https://​create.arduino.cc/​projecthub/​samanfern/​bluetooth-controlled-car-d5d9ca]] - Arduino Bluetooth Controlled Car 
 +  * [[https://​tutorial45.com/​arduino-bluetooth-rc-car-project/​]] ​ - Arduino Bluetooth Controlled Car 
 +  * [[http://​www.ardumotive.com/​bluetooth-rc-car.html]] - Arduino Bluetooth Controlled Car 
 +  *  
 +==== Указатели в 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 
 +  *   
 + 
 + 
 + 
 + 
 +==== АЦП ​====
  
 [[http://​codius.ru/​articles/​Arduino_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D1%8F%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BF%D0%BB%D0%B0%D1%82%D1%8B_%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%90%D0%A6%D0%9F_%D0%B8_analogRead|АЦП]] [[http://​codius.ru/​articles/​Arduino_%D1%83%D1%81%D0%BA%D0%BE%D1%80%D1%8F%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D0%BF%D0%BB%D0%B0%D1%82%D1%8B_%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2_%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE_%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_%D0%90%D0%A6%D0%9F_%D0%B8_analogRead|АЦП]]
Строка 1299: Строка 3414:
  
 {{::​termostat.png?​200|}} {{::​termostat.png?​200|}}
 +
 +{{:​termostat2.png?​300|}}
  
 {{::​imag2872_1.jpg?​300|}} {{::​imag2872_1.jpg?​300|}}
 +
  
 ===== DS18B20 (digital temperature sensor) and Arduino ===== ===== DS18B20 (digital temperature sensor) and Arduino =====
Строка 1384: Строка 3502:
   *    * 
  
-==== Программирование ====+==== Справочные ресурсы по программированию на Arduino ​====
   * https://​www.arduino.cc/​reference/​en/​   * https://​www.arduino.cc/​reference/​en/​
   * https://​www.arduino.cc/​reference/​en/​language/​functions/​communication/​serial/​   * https://​www.arduino.cc/​reference/​en/​language/​functions/​communication/​serial/​
Строка 1396: Строка 3514:
 ===== Полезные учебные ресурсы ===== ===== Полезные учебные ресурсы =====
  
 +  * [[https://​www.sololearn.com/​Course/​CPlusPlus/​]] - C++ Tutorial (Web версия на английском)
 +  * [[https://​play.google.com/​store/​apps/​details?​id=com.sololearn]] - Под android - SoloLearn: Учимся программировать (на русском)
   * [[https://​stepik.org/​course/​363]] Введение в программирование (C++)    * [[https://​stepik.org/​course/​363]] Введение в программирование (C++) 
 +  * [[https://​www.coursera.org/​learn/​roboty-arduino]] - Строим роботов и другие устройства на Arduino. От светофора до 3D-принтера
   * [[https://​yadi.sk/​i/​5CMqjaQX3Qr3Ns | Справочник по языку программирования для Arduino (*.pdf)]]   * [[https://​yadi.sk/​i/​5CMqjaQX3Qr3Ns | Справочник по языку программирования для Arduino (*.pdf)]]
   * [[https://​yadi.sk/​i/​B4dNTU4g3Qr3hQ | Arduino - быстрый старт (учебное пособие *.pdf)]]   * [[https://​yadi.sk/​i/​B4dNTU4g3Qr3hQ | Arduino - быстрый старт (учебное пособие *.pdf)]]
Строка 1406: Строка 3527:
   * [[http://​digitrode.ru/​computing-devices/​mcu_cpu/​522-ampermetr-na-arduino-svoimi-rukami.html]] - амперметр   * [[http://​digitrode.ru/​computing-devices/​mcu_cpu/​522-ampermetr-na-arduino-svoimi-rukami.html]] - амперметр
 ===== Литература ===== ===== Литература =====
-[[http://​publ.lib.ru/​ARCHIVES/​V/​VOYCEHOVSKIY_Yanush/​_Voycehovskiy_Ya..html]] - Войцеховский Я. Радиоэлектронные игрушки (электроника дома, на работе,​ в школе). (Nowoczesne zabawki: Elektronika w domu, pracy, szwkole, 1974) +  * [[http://​publ.lib.ru/​ARCHIVES/​V/​VOYCEHOVSKIY_Yanush/​_Voycehovskiy_Ya..html]] - Войцеховский Я. Радиоэлектронные игрушки (электроника дома, на работе,​ в школе). (Nowoczesne zabawki: Elektronika w domu, pracy, szwkole, 1974) 
-[[http://​portal.tpu.ru/​SHARED/​l/​LENAOLYA/​job/​imoyak/​Tab/​electronics.pdf]] А. В. Лукутин,​ Е. Б. Шандарова. ЭЛЕМЕНТЫ ЭЛЕКТРОНИКИ. Учебное пособие +  ​* ​[[http://​portal.tpu.ru/​SHARED/​l/​LENAOLYA/​job/​imoyak/​Tab/​electronics.pdf]] А. В. Лукутин,​ Е. Б. Шандарова. ЭЛЕМЕНТЫ ЭЛЕКТРОНИКИ. Учебное пособие по курсу «Электротехника,​ электроника»  
-по курсу «Электротехника,​ электроника»  +  ​* ​[[http://​publ.lib.ru/​ARCHIVES/​S/​SVOREN'​_Rudol'​f_Anatol'​evich/​_Svoren'​_R.A..html#​001]] - Рудольф Анатольевич Сворень
-[[http://​publ.lib.ru/​ARCHIVES/​S/​SVOREN'​_Rudol'​f_Anatol'​evich/​_Svoren'​_R.A..html#​001]] - Рудольф Анатольевич Сворень +
 ===== Нейронная сеть на Arduino ===== ===== Нейронная сеть на Arduino =====
  
   * [[http://​a-bolshakov.ru/​index/​0-396]]   * [[http://​a-bolshakov.ru/​index/​0-396]]
 +
 +===== Преподавание курса «Изучение киберфизических устройств и систем на базе микропроцессорных плат Arduino» =====
 +
 +  * [[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