моделька повеселее, код почти на русском =)
- Код: Выделить всё • Развернуть
'$prog &HFF , &HBD , &HC9 , &H00
$regfile = "m32def.dat" ' файл спецификации Меги32
$crystal = 7372800 ' указываем на какой частоте будем работать
$baud = 115200
$include "pult.bas"
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : направление_левый Alias Portc.2 'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : направление_правый Alias Portc.3 'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output 'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output 'ногу ШИМа правого движка сконфигурировали как выход
Const вперед = 0
Const назад = 1
скорость_левый Alias Pwm1b
скорость_правый Alias Pwm1a
Config Pinc.4 = Output : диод1_красный Alias Portc.4
Config Pinc.5 = Output : диод1_зеленый Alias Portc.5
Config Pinc.6 = Output : диод2_красный Alias Portc.6
Config Pinc.7 = Output : диод2_зеленый Alias Portc.7
Const зажечь = 1
Const потушить = 0
Config Pind.2 = Input : кнопка Alias Pind.2
Config Pinb.2 = Input : питание Alias Pinb.2
Config Pind.7 = Output : Portd.7 = 0 : динамик Alias Portd.7 ' динамик
' Прерывание по спаду уровня для обработки команд RC5
Config Int1 = Falling
On Int1 принять_команду_пульта
Enable Int1
Config Rc5 = Pind.3
' Глобальные переменные
Dim команда_пульта_адрес As Byte , команда_пульта As Byte
Dim Adc_temp As Word , Akb As Single
Dim Errbyte As Byte
' Процедуры
Declare Sub Processcommand()
диод2_зеленый = зажечь
' Запуск
Enable Interrupts
Waitms 200
Print "Start MiniBot v2.1"
Do
Idle
Loop
принять_команду_пульта:
Disable Int1
Enable Interrupts
Getrc5(команда_пульта_адрес , команда_пульта)
Enable Interrupts
If команда_пульта_адрес = Ir_adress And команда_пульта <> 255 Then ' используется пульт Минибота с кодом адреса = 0
команда_пульта = команда_пульта And &B01111111
Print Chr(12);
'Print "IR_Address - " ; команда_пульта_адрес
Print "IR_command - " ; команда_пульта
End If
' обработка команды
Gosub Processcommand
Gifr = Gifr Or &B10000000 'Clear Flag Int1
Enable Int1
Return
Sub Processcommand()
Const прибавка_скорости = 20
Const точка_останова = 50
Local возможная_скорость As Integer
Select Case команда_пульта
Case Btn_up:
возможная_скорость = скорость_левый + скорость_правый ' выравниваем скорости движения
возможная_скорость = возможная_скорость \ 2
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
If направление_левый = назад And направление_правый = назад Then ' движемся вперед или назад
возможная_скорость = скорость_правый - прибавка_скорости
If возможная_скорость < точка_останова Then
направление_левый = вперед : направление_правый = вперед
скорость_левый = точка_останова : скорость_правый = точка_останова
Else
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
End If
Else
возможная_скорость = скорость_правый + прибавка_скорости
If возможная_скорость > 255 Then
возможная_скорость = 255
End If
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
End If
Case Btn_down:
If скорость_левый = точка_останова Or скорость_правый = точка_останова Then ' если хотим ехать назад из танокового разворота
направление_левый = назад : направление_правый = назад
End If
возможная_скорость = скорость_левый + скорость_правый ' выравниваем скорости движения
возможная_скорость = возможная_скорость \ 2
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
If направление_левый = вперед And направление_правый = вперед Then ' движемся вперед или назад
возможная_скорость = скорость_правый - прибавка_скорости
If возможная_скорость < точка_останова Then
направление_левый = назад : направление_правый = назад
скорость_левый = точка_останова : скорость_правый = точка_останова
Else
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
End If
Else
возможная_скорость = скорость_правый + прибавка_скорости
If возможная_скорость > 255 Then
возможная_скорость = 255
End If
скорость_левый = возможная_скорость : скорость_правый = возможная_скорость
End If
Case Btn_left:
возможная_скорость = скорость_левый + прибавка_скорости
If возможная_скорость < 255 Then
скорость_левый = возможная_скорость
Else
скорость_левый = 255
возможная_скорость = скорость_правый - прибавка_скорости
If возможная_скорость > точка_останова Then
скорость_правый = возможная_скорость
Else
скорость_правый = точка_останова
End If
End If
Case Btn_right:
возможная_скорость = скорость_правый + прибавка_скорости
If возможная_скорость < 255 Then
скорость_правый = возможная_скорость
Else
скорость_правый = 255
возможная_скорость = скорость_левый - прибавка_скорости
If возможная_скорость > точка_останова Then
скорость_левый = возможная_скорость
Else
скорость_левый = точка_останова
End If
End If
Case Btn_ok:
направление_левый = вперед : направление_правый = вперед
скорость_левый = точка_останова : скорость_правый = точка_останова
Case Btn_power:
направление_левый = вперед : направление_правый = вперед
скорость_левый = 0 : скорость_правый = 0
Case Else:
' ни одна из вышеперечисленных кнопок
End Select
End Sub
нужно настраивать:
- параметр точка_останова - должен быть минимальным значением скважности шим, при котором двигатели не крутяться
- параметр прибавка_скорости - прибавка скважности шим с каждым приходом команды, от неё зависит резкоть управления
управление осуществляется 6тью кнопками - вверх, вниз, влево, вправо, ок, питание. конпка ок сбрасывает скважность шим до точки_останова, конпка питание - в ноль. таким образом на парковку бот ставится нажатием "питания", а оставнавливается (или снимается с парковки) - нажатием "ок". остальные кнопки - чем дольше жмем, тем выраженнее становится движение бота в эту сторону.
кнопка вперед/назад выравнивает скорости двигателей и одновременно увеличивает/уменьшает.
кнопки влево/вправо вначале увеличивают скорость соответствующео двигателя, при достижении максимума уменьшают скорость противоположного до точки_останова, танковый разворот не предусмотрен.
вообще идея такая, что для смнеы направления движения нужно нажимать вперед/стоп/назад. вотнекоторые ситуации:
- едем вперед, жмем кнопку налево, бот поворачивает. когда считаем, что поворот закончен, жмем либо стоп, либо вперед/назад.
- стоим на месте, жмем вправо, бот поворачивает. когда поворот окончен, жмем либо стоп, что остановит пылесос, либо вперед(назад), что выравняет скорости двигателей по направлению вперед(назад).
- стоим на месте, жмем вначале влево, потом вправо. бот начинает движение вперед. чтобы сразу повернуть вправо нужно после нажатия "влево" скомандовать либо стоп, либо вперед/назад