Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
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 | ||
+ |