Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ
Boolean left = !digitalRead (LEFT_SENSOR_PIN); ΠΠ΅Π»Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π½ΠΎΠ²ΠΎ. ΠΠΏΠ΅ΡΡΠ΄, Π΅ΡΠ»ΠΈ LOW — Π½Π°Π·Π°Π΄. AnalogWrite (SPEED_RIGHT, SPEED / BRAKE_K); Π§Π΅ΠΌ Π±ΠΎΠ»ΡΠ΅, ΡΠ΅ΠΌ Π±ΡΡΡΡΠ΅Π΅. Π§ΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΏΠΎΠ²ΠΎΡΠΎΡ. ΠΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π½Π°Π»Π΅Π²ΠΎ. Π¦Π΅Π»Π΅Π²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. Π‘ΡΠ°Π·Ρ Π΅Π΄Π΅ΠΌ Π²ΠΏΠ΅ΡΡΠ΄. AnalogWrite (SPEED_RIGHT, SPEED); AnalogWrite (SPEED_LEFT, SPEED); AnalogWrite (SPEED_LEFT, SPEED); DigitalWrite (DIR_RIGHT, HIGH); DigitalWrite… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΡΠ°Π²ΠΈΡ ΡΠΎΠ±ΡΠ°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΏΠΎ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ½ΡΡ Π»ΠΈΠ½ΠΈΡ, Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π½Π½ΡΡ Π½Π° Π±Π΅Π»ΡΡ Π»ΠΈΡΡΠ°Ρ Π±ΡΠΌΠ°Π³ΠΈ.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΡΡΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ Π±Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΠΈ Π½Π° Π½ΡΠΌ ΡΡΡΠ½ΡΠΌ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½ ΡΡΠ΅ΠΊ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΠΎΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π°ΡΡΠΈΠΊΠΈ Π»ΠΈΠ½ΠΈΠΈ Π²ΡΠ΄Π°ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½ΠΎΠ»Ρ, ΠΊΠΎΠ³Π΄Π° «Π²ΠΈΠ΄ΡΡ» ΡΡΡΠ½ΠΎΠ΅ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° «Π²ΠΈΠ΄ΡΡ» Π±Π΅Π»ΠΎΠ΅.
ΠΠ° ΠΏΡΡΠΌΠΎΠΉ ΡΠΎΠ±ΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ ΡΡΠ΅ΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π½ΡΠΎΡΠΎΠ², ΡΠΎ Π΅ΡΡΡ ΠΎΠ±Π° ΡΠ΅Π½ΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠΊΠΈ.
ΠΡΠΈ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ΅ ΡΡΠ°Π΅ΠΊΡΠΎΡΠΈΠΈ Π½Π°ΠΏΡΠ°Π²ΠΎ, ΠΏΡΠ°Π²ΡΠΉ ΡΠ΅Π½ΡΠΎΡ Π½Π°Π΅Π·ΠΆΠ°Π΅Ρ Π½Π° ΡΡΠ΅ΠΊ ΠΈ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½ΠΎΠ»Ρ. ΠΡΠΈ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ΅ Π½Π°Π»Π΅Π²ΠΎ, Π½ΠΎΠ»Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π»Π΅Π²ΡΠΉ ΡΠ΅Π½ΡΠΎΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΠΎΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΡΡΠ΅ΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΠΌΠΈ:
STATE_FORWARD — Π½ΡΠΆΠ½ΠΎ Π΅Ρ Π°ΡΡ Π²ΠΏΠ΅ΡΡΠ΄.
STATE_RIGHT — Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ Π½Π°ΠΏΡΠ°Π²ΠΎ.
STATE_LEFT — Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡΡΡ Π½Π°Π»Π΅Π²ΠΎ ΠΠ° Π²Ρ ΠΎΠ΄ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΡΠ΅Π½ΡΠΎΡΠΎΠ². ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΎΠ²:
ΠΠ΅Π²ΡΠΉ. | ΠΡΠ°Π²ΡΠΉ. | Π¦Π΅Π»Π΅Π²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. |
STATE_FORWARD. | ||
STATE_RIGHT. | ||
STATE_LEFT. | ||
STATE_FORWARD. |
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΠ»ΠΎΠΊ ΡΡ Π΅ΠΌΠ° Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
// ΠΠΎΡΠΎΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΊ ΠΊΠ»Π΅ΠΌΠΌΠ°ΠΌ M1+, M1-, M2+, M2;
// Motor shield ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅ΡΡΡΠ΅ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ° 6,5,7,4 Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠΎΡΠΎΡΠ°ΠΌΠΈ.
#define SPEED_LEFT 6.
#define SPEED_RIGHT 5.
#define DIR_LEFT 7.
#define DIR_RIGHT 4.
#define LEFT_SENSOR_PIN 8.
#define RIGHT_SENSOR_PIN 9.
// Π‘ΠΊΠΎΡΠΎΡΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π΄Π²ΠΈΠΆΠ΅ΠΌΡΡ Π²ΠΏΠ΅ΡΡΠ΄ (0−255).
#define SPEED 35.
// ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ, Π·Π°Π΄Π°ΡΡΠΈΠΉ Π²ΠΎ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π½ΡΠΆΠ½ΠΎ Π·Π°ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ.
// ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΠ»ΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ°.
#define BRAKE_K 4.
#define STATE_FORWARD 0.
#define STATE_RIGHT 1.
#define STATE_LEFT 2.
int state = STATE_FORWARD;
void runForward ().
{.
state = STATE_FORWARD;
// ΠΠ»Ρ ΡΠ΅Π³ΡΠ»ΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΊΠΎΡΠΎΡΡΠΈ `SPEED` ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ 0 Π΄ΠΎ 255,.
// ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΠ΅, ΡΠ΅ΠΌ Π±ΡΡΡΡΠ΅Π΅.
analogWrite (SPEED_LEFT, SPEED);
analogWrite (SPEED_RIGHT, SPEED);
// ΠΡΠ»ΠΈ Π² DIR_LEFT ΠΈΠ»ΠΈ DIR_RIGHT ΠΏΠΈΡΠ΅ΠΌ HIGH, ΠΌΠΎΡΠΎΡ Π±ΡΠ΄Π΅Ρ Π΄Π²ΠΈΠ³Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΊΠΎΠ»Π΅ΡΠΎ.
// Π²ΠΏΠ΅ΡΡΠ΄, Π΅ΡΠ»ΠΈ LOW — Π½Π°Π·Π°Π΄.
digitalWrite (DIR_LEFT, HIGH);
digitalWrite (DIR_RIGHT, HIGH);
}.
void steerRight ().
{ state = STATE_RIGHT;
// ΠΠ°ΠΌΠ΅Π΄Π»ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΎΠ΅ ΠΊΠΎΠ»Π΅ΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ,.
// ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΏΠΎΠ²ΠΎΡΠΎΡ.
analogWrite (SPEED_RIGHT, SPEED / BRAKE_K);
analogWrite (SPEED_LEFT, SPEED);
digitalWrite (DIR_LEFT, HIGH);
digitalWrite (DIR_RIGHT, HIGH);
}.
void steerLeft ().
{.
state = STATE_LEFT;
analogWrite (SPEED_LEFT, SPEED/BRAKE_K); analogWrite (SPEED_RIGHT, SPEED);
digitalWrite (DIR_LEFT, HIGH);
digitalWrite (DIR_RIGHT, HIGH);
}.
void setup ().
{.
// ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ Π²ΡΠ²ΠΎΠ΄Ρ ΠΏΠ»Π°ΡΡ 4,5,6,7 Π½Π° Π²ΡΠ²ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΎΠ².
for (int i = 4; i <= 7; i++).
pinMode (i, OUTPUT);
// Π‘ΡΠ°Π·Ρ Π΅Π΄Π΅ΠΌ Π²ΠΏΠ΅ΡΡΠ΄.
runForward ();
}.
void loop ().
{.
// ΠΠ°Ρ ΡΠΎΠ±ΠΎΡ Π΅Π·Π΄ΠΈΡ ΠΏΠΎ Π±Π΅Π»ΠΎΠΌΡ ΠΏΠΎΠ»Ρ Ρ ΡΡΡΠ½ΡΠΌ ΡΡΠ΅ΠΊΠΎΠΌ. Π ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
// ΠΈΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ Π΄Π°ΡΡΠΈΠΊΠΎΠ².
boolean left = !digitalRead (LEFT_SENSOR_PIN);
boolean right = !digitalRead (RIGHT_SENSOR_PIN);
// Π ΠΊΠ°ΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ?
int targetState;
if (left == right).
{.
// ΠΏΠΎΠ΄ ΡΠ΅Π½ΡΠΎΡΠ°ΠΌΠΈ Π²ΡΡ Π±Π΅Π»ΠΎΠ΅ ΠΈΠ»ΠΈ Π²ΡΡ ΡΡΡΠ½ΠΎΠ΅.
// Π΅Π΄Π΅ΠΌ Π²ΠΏΠ΅ΡΡΠ΄.
targetState = STATE_FORWARD;
}.
else if (left) {.
// Π»Π΅Π²ΡΠΉ ΡΠ΅Π½ΡΠΎΡ ΡΠΏΡΡΡΡ Π² ΡΡΠ΅ΠΊ.
// ΠΏΠΎΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π½Π°Π»Π΅Π²ΠΎ.
targetState = STATE_LEFT;
}.
else.
{.
targetState = STATE_RIGHT;
}.
if (state == targetState).
{.
// ΠΌΡ ΡΠΆΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΡ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ,.
// Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π½ΠΎΠ²ΠΎ.
return;
}.
switch (targetState).
{ case STATE_FORWARD:
runForward ();
break;
case STATE_RIGHT:
steerRight ();
break;
case STATE_LEFT:
steerLeft ();
break;
}.
// Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ ΡΠΈΠ»ΡΠ½ΠΎ Π²ΠΈΠ»ΡΡΡ Π½Π° ΠΏΡΡΠΌΠΎΠΉ.
delay (50);
}.