roboforum.ru

Технический форум по робототехнике.

Прога мобильного робота на бейсике

Re: Прога мобильного робота на бейсике

space » 14 авг 2008, 23:02

я пробовал без цикла, но как раз если его убрать, то работать не будет

Re: Прога мобильного робота на бейсике

Кирилл » 15 авг 2008, 00:56

удивительно однако! :no:
кстати а какая у тебя кнопка? положение фиксируется? если нет то понятно почему первый код не работает.

Re: Прога мобильного робота на бейсике

Сергей » 15 авг 2008, 02:35

Говорю вам - чудес не бывает. Если чтото не работает - то это косяк программиста.

Re: Прога мобильного робота на бейсике

space » 15 авг 2008, 11:30

Кирилл писал(а):удивительно однако! :no:
кстати а какая у тебя кнопка? положение фиксируется? если нет то понятно почему первый код не работает.

кнопка без фиксации.

Re: Прога мобильного робота на бейсике

Кирилл » 15 авг 2008, 12:00

Тогда все просто :) Вот код но1
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"
$crystal = 16000000

Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3
Dim Rand As Byte
Do                                                          'Основной цикл программы

Основная_программа:

If Кнопка_старт = 0 Then : Gosub Выбор_направления : End If
If Кнопка_стоп = 0 Then : Gosub Ожидание : End If

Loop
End

Выбор_направления:
Rand = Rnd(50)

If Rand = 48 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 1 Then : Gosub Стоп : Waitus 10 : End If
If Rand = 49 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 17 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 27 Then : Gosub Вперёд : Wait 2 : End If
If Rand = 32 Then : Gosub Вперёд : Wait 1 : End If
If Rand = 44 Then : Gosub Назад : Wait 1 : End If
If Rand = 4 Then : Gosub Назад : Wait 1 : End If
If Rand = 45 Then : Gosub Вправо : Wait 1 : End If
If Rand = 2 Then : Gosub Вправо : Wait 1 : End If
If Rand = 22 Then : Gosub Влево : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Wait 1 : End If

Goto Основная_программа

Ожидание:                                                   ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Goto Основная_программа

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------

Стоп:                                                       ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                                                     ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                                              ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                                               ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                                                      ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                                               ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                                                ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                                                     ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                                                      ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return
сначала программа опрашивает кнопки. Если кнопка нажата она переходит на метку выбор направления либо ожидание. После завершения подпрограммы, программа опять возвращается на опрос кнопок, однако палец то ты уже убрал - кнопка не нажата! Поэтому когда ты опять нажимаешь кнопку программа как ей и положено переходит к выполнению подпрограммы. Для того чтобы устранить эту проблему надо сделать фиксацию для кнопки - программную или железную. Ну с железной я думаю понятно. А программную можно сделать так: при опросе кнопок не сразу переходить куда нибудь, а просто изменять значение какого либо бита. И перед выполнение какого либо действия этот бит проверять - 1 там или 0. 1 - делаем то-то, 0 - то-то. ну и кнопки проверять не забываем на предмет изменения их состояния с последующим изменением значения бита. О как :crazy:

Re: Прога мобильного робота на бейсике

space » 15 авг 2008, 15:59

Кирилл писал(а): А программную можно сделать так: при опросе кнопок не сразу переходить куда нибудь, а просто изменять значение какого либо бита. И перед выполнение какого либо действия этот бит проверять - 1 там или 0. 1 - делаем то-то, 0 - то-то. ну и кнопки проверять не забываем на предмет изменения их состояния с последующим изменением значения бита. О как :crazy:

А не подскажешь как написать это? :oops:

Добавлено спустя 1 час 49 минут 46 секунд:
Хотя в принципе вот нашёл решения. Там как раз сказано, что использовать команду IF ... Then ... End if не стоит, а лучше воспользоваться внешними перываниями Int0 или Int1, но есть одно но у меня кнопки подключены на Pc2 и Pc3, когда Int0 например на меге16 находится на Pd2. Можно ли сделать внешние прерывания на Pc2, Pc3, так же как в программе ниже:
Код: Выделить всёРазвернуть
$regfile = "2313def.dat"
$crystal = 4000000

Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling

Dim Wtime As Byte

On Int0 Stopbutton

Cls

Wtime = 255

Enable Interrupts
Enable Int0

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
Loop

Stopbutton:
  Lcd "stopъ!"
Return

End

Re: Прога мобильного робота на бейсике

Кирилл » 15 авг 2008, 18:48

ну где то так:
Код: Выделить всёРазвернуть
Dim Button As Bit

  If Portd.4 = 0 Then
     If Button = 0 Then
         Button = 1
        Else
         Button = 0
     End If
  End If

и вместо состояния порта в основном цикле проверять состояние битов кнопок, а проверку состояния порта вынести как подпрограмму.

Re: Прога мобильного робота на бейсике

space » 15 авг 2008, 23:18

А... :roll: Это я знаю. Я в самом начале приводил пример почти такой же.
Код: Выделить всёРазвернуть
    If Кнопка_старт = 1 Then : Gosub Выбор_направления
    Else
    Gosub Основная_программа : End if

Но щас прога выглядет по другому поэтому попробую. А то стоп срабатывает только по истечению 1 секунды. Из-за задержак, которые стоят на движение

Добавлено спустя 3 часа 37 минут 12 секунд:
Подправил прогу и теперь все направления выводятся на дисплее. Чтобы остановился нужно удерживать кнопку в течение 1 секунды
Код: Выделить всёРазвернуть
$regfile = "m16def.dat"                                     'используем мк ATmega16
$crystal = 16000000                                         'частота кварцевого резонатора 16mHz
$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
$baud = 19200                                               'Скорость COM-порта
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                                         'используем дисплей на 2 строчки по 16 знакомест в каждой

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево).

Config Pind.2 = Input : Bumper_r Alias Pind.2               'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3               'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_3 Alias Pinc.4               'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

Config Pinb.0 = Output : Red_0 Alias Portb.0                'PB 0 устанавливаем на выход и присваиваем имя Red_0;
Config Pinb.1 = Output : Red_1 Alias Portb.1                'PB 1 устанавливаем на выход и присваиваем имя Red_1;
Config Pinb.2 = Output : Red_2 Alias Portb.2                'PB 2 устанавливаем на выход и присваиваем имя Red_2.

Enable Interrupts                                           ' разрешаем прерывания

Dim Rand As Byte                                            ' указываем переменную для выбора направления

Print "Start RoBi"                                          ' выводим стартовую надпись в терминали через COM-порт
Основная_программа:
Cls                                                         'команда очистки дисплея
Cursor Off                                                  ' отключаем корсор на LCD
Locate 1 , 4                                                ' перемещение курсора в указанную позицию
Lcd "I am RoBi!"                                            'выводим надпись
Locate 2 , 2                                                ' перемещение курсора в указанную позицию
Lcd "Gotov k rabote"                                        'выводим надпись

Do                                                          'Основной цикл программы
If Кнопка_старт = 0 Then : Gosub Выбор_направления : End If 'Если нажата кнопка старт , то переходим в подпрограмму "Выбор_направления"
Loop

Do
Выбор_направления:
Rand = Rnd(20)                                              ' Выбирает любое число (от 0 до 19)
Cls                                                         ' Очищаем дисплей
Cursor Off                                                  ' Отключаем курсор
Lcd "Rand=" ; Rand                                          ' Выводим на дисплее направление (Н-р: на дисплее: Rand=0)
' например If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 2 : End If
' если выбрали 17, тогда переходим в подпрограмму "стоп", выводим на дисплее: , Stop и выполняем всё это 2 секунды и т.д.
If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 18 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 9 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 5 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 1 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 4 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 0 Then : Gosub Назад : Locate 1 , 7 : Lcd ", Back" : Wait 1 : End If
If Rand = 14 Then : Gosub Назад : Locate 1 , 8 : Lcd ", Back" : Wait 1 : End If
If Rand = 12 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 16 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Rand = 8 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Кнопка_стоп = 0 Then : Gosub Основная_программа : End If 'Если нажата кнопка стоп , то переходим в подпрограмму "Основная_программа"


Debounce Bumper_r , 0 , L                                   'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                                   'сработал левый датчик, переходим на выполнение команды Br
Loop

'' -----------------------------------------------------------------------------
'' Включение комбинации моторов для движения в заданном направлении
'' -----------------------------------------------------------------------------

Стоп:                                                       ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Вперёд:                                                     ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_вправо:                                              ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 :
Return
Вперёд_влево:                                               ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 :
Return
Назад:                                                      ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 :
Return
Назад_вправо:                                               ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 :
Return
Назад_влево:                                                ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 :
Return
Вправо:                                                     ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 :
Return
Влево:                                                      ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 :
Return

R:                                                          ' выполнять после срабатывания правого датчика
Gosub Назад                                                 ' переходим в подпрограмму "Назад"
Wait 1                                                      ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Выбор_направления                                      ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Выбор_направления

Re: Прога мобильного робота на бейсике

EdGull » 16 авг 2008, 07:28

теперь ты просто обязан у себя в профиле исправить прог. языки: Bascom AVR Basic :D

Re: Прога мобильного робота на бейсике

space » 16 авг 2008, 14:24

Добавил в программу энкодеры и управление с помощью ик-пульта. Как понял по урокам EdGull'a энкодеры подключаются на ноги ШИМа левого и правого движка. Короче, если в программе всё правильно написал, то работать будет. Я всё скомпилировал и зашил в мк. Кнопки перехода на rc и направления движений работают. Стоп тоже.
Кстати вопрос, а можно сделать перезагрузку мк при нажатии кнопки стоп? А точнее не перезагрузка, а сброс программы.
Код: Выделить всёРазвернуть
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Программа произвольного движения для робота "RoBi"
' RoBi.bas - главный файл проекта , в котором реализована программа
' робота;
' Автор Space:
' -программа для мк ATmega16
' -используется кварц на 16мГц
' -компилятор Bascom AVR
' -присутствует ограничение по скорости с помощью энкодеров
' -есть управление с помощью ик-пульта
' -при роботе программы выбора направления, число и направление выводится на ЖКИ
' Программа 2008 для робота "RoBi" - www.robptsspace.ucoz.ru
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$regfile = "m16def.dat"                                     'используем мк ATmega16
$crystal = 16000000                                         'частота кварцевого резонатора 16mHz

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' COM-порт
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$baud = 19200                                               'Скорость COM-порта
Print "Start RoBi"                                          ' выводим стартовую надпись в терминали через COM-порт.

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' указываем переменные
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Dim Rand As Byte                                            ' для выбора направления;
Dim Speed As Byte                                           ' для скорости;
Speed = 70
Dim Address As Byte                                         ' для приёма сигнала с ик-пульта;
Dim Command As Byte                                         ' для приёма сигнала с ик-пульта.
Enable Interrupts                                           ' Разрешаем прерывания.

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Дополнительные кнопки
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Config Pinc.2 = Input : Кнопка_старт Alias Pinc.2           'PC 2 устанавливаем на вход и присваиваем имя Кнопка_старт;
Config Pinc.3 = Input : Кнопка_стоп Alias Pinc.3            'PC 3 устанавливаем на вход и присваиваем имя Кнопка_стоп;
Config Pinc.4 = Input : Кнопка_rc5 Alias Pinc.4             'PC 4 устанавливаем на вход и присваиваем имя Кнопка_3;
Config Pinc.5 = Input : Кнопка_4 Alias Pinc.5               'PC 5 устанавливаем на вход и присваиваем имя Кнопка_4.

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Работа ЖКИ
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
' указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                                         'используем дисплей на 2 строчки по 16 знакомест в каждой
'Начало подпрограммы
Основная_программа:
Cls                                                         'команда очистки дисплея.
Cursor Off                                                  ' отключаем корсор на LCD.
Locate 1 , 4                                                ' перемещение курсора в указанную позицию.
Lcd "I am RoBi!"                                            'выводим надпись.
Locate 2 , 2                                                ' перемещение курсора в указанную позицию.
Lcd "Gotov k rabote"                                        'выводим надпись.
Do                                                          'Основной цикл программы.
If Кнопка_старт = 0 Then : Gosub Выбор_направления : End If 'Если нажата кнопка старт , то переходим в подпрограмму "Выбор_направления".
If Кнопка_rc5 = 0 Then : Gosub Rc5 : End If
Loop
Останавливаемся:                                            ' остановка
Reset Porta.0 : Reset Porta.1 : Reset Porta.2 : Reset Porta.3
Goto Основная_программа

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Управление с ИК-пульта
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Config Pina.6 = Input : Tsop Alias Pina.6                   'PA 6 устанавливаем на вход и присваиваем имя Tsop.
Rc5:
Cls                                                         'команда очистки дисплея.
Cursor Off                                                  ' отключаем корсор на LCD.
Locate 1 , 4                                                ' перемещение курсора в указанную позицию.
Lcd "RC5_Signal"                                            'выводим надпись.
Do
   Gosub Прием_rc5
   If Command = 255 Then : Gosub Стоп : Locate 2 , 7 : Lcd "Stop"
   Elseif Command = 32 Then : Gosub Вперёд : Locate 2 , 6 : Lcd "Forvard" : Wait 1
   Elseif Command = 33 Then : Gosub Назад : Locate 2 , 6 : Lcd "Back" : Wait 1
   Elseif Command = 17 Then : Gosub Влево : Locate 2 , 6 : Lcd "In left" : Wait 1
   Elseif Command = 16 Then : Gosub Вправо : Locate 2 , 7 : Lcd "In right" : Wait 1
   End If
Loop
Прием_rc5:
   Getrc5(address , Command)
   If Address <> 255 And Command <> 255 Then
      Command = Command And &B01111111
      Print Chr(12);                                        ' выводим в терминал символ
      Print "Address - " ; Address;                         ' выводим в терминал адрес
      Print "Command - " ; Command;                         ' выводим в терминал номер команды
   End If
Return


' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Датчики
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

' временный код
Config Pind.2 = Input : Bumper_r Alias Pind.2               'PD 0 устанавливаем на вход и присваиваем имя Bumper_r(правый бампер);
Config Pind.3 = Input : Bumper_l Alias Pind.3               'PD 1 устанавливаем на вход и присваиваем имя Bumper_l(левый бампер).

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Подпрограмма работы моторов в месте с энкодерами
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Config Pina.0 = Output : Fr Alias Porta.0                   'PA 0 устанавливаем на выход и присваиваем имя Fr(вперёд-вправо);
Config Pina.1 = Output : Br Alias Porta.1                   'PA 1 устанавливаем на выход и присваиваем имя Br(назад-вправо);
Config Pina.2 = Output : Bl Alias Porta.2                   'PA 2 устанавливаем на выход и присваиваем имя Bl(назад-влево);
Config Pina.3 = Output : Fl Alias Porta.3                   'PA 3 устанавливаем на выход и присваиваем имя Fl(вперёд-влево);
Config Pina.4 = Output                                      'ногу ШИМа левого  движка сконфигурировали как выход;
Config Pina.5 = Output                                      'ногу ШИМа правого движка сконфигурировали как выход.
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down

Do                                                          'Основной цикл программы.
Выбор_направления:                                          ' Начало подпрограммы
Rand = Rnd(20)                                              ' Выбирает любое число (от 0 до 19)
Cls                                                         ' Очищаем дисплей
Cursor Off                                                  ' Отключаем курсор
Lcd "Rand=" ; Rand                                          ' Выводим на дисплее направление (Н-р: на дисплее: Rand=0)
' например If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 2 : End If
' если выбрали 17, тогда переходим в подпрограмму "стоп", выводим на дисплее: , Stop и выполняем всё это 2 секунды и т.д.
If Rand = 17 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 18 Then : Gosub Стоп : Locate 1 , 8 : Lcd ", Stop" : Wait 1 : End If
If Rand = 9 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 5 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 1 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 4 Then : Gosub Вперёд : Locate 1 , 7 : Lcd ", Forvard" : Wait 1 : End If
If Rand = 0 Then : Gosub Назад : Locate 1 , 7 : Lcd ", Back" : Wait 1 : End If
If Rand = 14 Then : Gosub Назад : Locate 1 , 8 : Lcd ", Back" : Wait 1 : End If
If Rand = 12 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 16 Then : Gosub Вправо : Locate 1 , 8 : Lcd ", In right" : Wait 1 : End If
If Rand = 3 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Rand = 8 Then : Gosub Влево : Locate 1 , 7 : Lcd ", In left" : Wait 1 : End If
If Кнопка_стоп = 0 Then : Gosub Останавливаемся : End If    'Если нажата кнопка стоп , то переходим в подпрограмму "Останавливаемся"

Debounce Bumper_r , 0 , L                                   'сработал правый датчик, переходим на выполнение команды Bl
Debounce Bumper_l , 0 , R                                   'сработал левый датчик, переходим на выполнение команды Br
Loop

' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Подпрограммы включение комбинаций моторов для движения в заданном направлении.
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Стоп:                                                       ' стоим на месте
Fr = 0 : Br = 0 : Bl = 0 : Fl = 0 : Pwm1b = 0 : Pwm1a = 0:
Return
Вперёд:                                                     ' едим вперёд
Fr = 1 : Br = 0 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вперёд_вправо:                                              ' поварачиваем вправо
Fr = 0 : Br = 0 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вперёд_влево:                                               ' поворачиваем влево
Fr = 1 : Br = 0 : Bl = 0 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад:                                                      ' назад
Fr = 0 : Br = 1 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад_вправо:                                               ' поворачиваем назад-вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Назад_влево:                                                ' поворачиваем назад-влево
Fr = 0 : Br = 0 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return
Вправо:                                                     ' разворот на метсе вправо
Fr = 0 : Br = 1 : Bl = 0 : Fl = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return
Влево:                                                      ' разворот на месте влево
Fr = 1 : Br = 0 : Bl = 1 : Fl = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

R:                                                          ' выполнять после срабатывания правого датчика
Gosub Назад                                                 ' переходим в подпрограмму "Назад"
Wait 1                                                      ' выполняем её в течение 2,5 секунд
Gosub Назад_влево
Wait 1
Gosub Стоп
Goto Выбор_направления                                      ' переходим к началу основного цикла после выполнения команд
L:
Gosub Назад
Wait 1
Gosub Назад_вправо
Wait 1
Gosub Стоп
Goto Выбор_направления


Rambler\'s Top100 Mail.ru counter